这个用贪心的话 会出错 记录一下这个例子 比如金额是10块,面币为2 5 6 11 10 按照贪心的话 肯定选6和2张2,但是只要2张5块就可以了,因此贪心法会出现问题,所以,需要用动态规划,写出状态转移方程,遍历金额,随后里面套一个面币数量的循环,当遍历到当前金额的时候 只要当前金额减去当前面币值大于0 随后取这个后的最小和不取这个后的最小即可,可能语言组织不大好,直接上代码吧
#include <iostream>
using namespace std;
int main() {
//硬币面值的数组
int values[100];
//要找零的数
int money,size;
//保存每个面值对应的最小值 因为0号位置要舍弃 因此要加1
//输入总共有几种面值 和从小到大输入每种面值的大小
cout<<"输入要找零的金额";
cin>>money;
cout<<"输入要面值的总数和种类";
cin>>size;
for(int i = 0; i < size; i++)
cin >> values[i];
int *coinsUsed = new int[money + 1];
coinsUsed[0] = 0;
//总共的钱数的遍历
int mincoin = 0;
for(int i = 1; i <= money; i++){
mincoin = i;
//总共有几种面值的遍历
for (int j = 0; j < size; j++) {
//如果当前第j中面值小于总共的钱数
if(values[j] <= i){
//用了这一面值 前提是用这张纸币的数量比不用这张纸币的数量小采用
mincoin = min(mincoin,coinsUsed[i - values[j]] + 1);
}
}
//当前金额所需的最小纸张数
coinsUsed[i] = mincoin;
}
cout<<"总共需要面币张数为"<<coinsUsed[money]<<endl;
return 0;
}
http://blog.youkuaiyun.com/wdxin1322/article/details/9501163参考的博客