c++ 动态规划 找零钱

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

// 找零钱.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include
#include

#include

#include


# include "stdlib.h"
using namespace std;

//定义表格中的单元格
class unit{
public:
int coin; //当前单元格所花费的当前币种
string message;//每个单元格的coin的最少硬币数构成组成信息
unit() :coin(0), message("")
{}

};
int _tmain(int argc, _TCHAR* argv[])
{


int types, money;
cout << "请输入硬币的种类\n";
cin >> types ;
vectorcoin(types, 0);
cout << "请输入各个硬币\n";
for (int i = 0; i < types; i++)
{
cin >> coin[i];

}
cout << "请输入要找的零钱\n";

//对硬币币值升序排序,
sort(coin.begin(), coin.end());
cin >> money;

//定义多张表格,张数为硬币的种类,每张表格有money+1列。
vector > table(types, vector < unit> (money+1));

//对于一个列,对于各种解决方案的总硬币数目进行存储,
vector result;


for (int i = 0; i < types; i++) //开始考虑每个币种,
{
if (i == 0)
{
//第一张表格初始化,一般情况,最小币值一定是1,所以第一张表格中每个单元格很好填,耗费的硬币数目就是列号
for (int j = 0; j < money + 1; j++)
{

table[i][j].coin = j; //第j列的找零需要j个1元硬币

table[i][j].message = to_string(j) + "*" + to_string(1); //信息

}
}
else{
//接下来开始计算后面的几张表格。就是考虑每一个新币种的加入
for (int j = 0; j < money + 1; j++)
{

//对于一个列所对应的需要找零的数目,当前币值的可以取多个,只要总数不超过列对应的找零数目,余数部分由上一个表来凑。
for (int k = 0; k*coin[i] <= j; k++)
{

//当前币值的硬币用了k个,不足的部分用上一个表的最佳方案。
result.push_back(k + table[i-1][j - k*coin[i]].coin);
}

//一个列中,消耗硬币数最少的方案
auto g= min_element(result.begin(), result.end());
//当前列所需要的最小硬币数目:*g
table[i][j].coin = *g;

//当前币种用了l个
int l = (int)(g - result.begin());



//更信信息
table[i][j].message = table[i - 1][j - coin[i]*l].message +"+" +to_string(l) + "*" + to_string(coin[i]);

//清空,准备下一个列的计算。
result.clear();

}



}

}
cout << "需要的硬币数目为"<< table[types - 1][money].coin<cout << "解决方案为" << table[types - 1][money].message;
system("pause");
return 0;
}


相关文档
最新文档