尽量使用大面值硬币。
因为不用大面值,将使用更多小面值硬币,一定得不到最优解。
#include <iostream>
using namespace std;
int cnts[6]; //放相应的硬币数
int coins[6]={1,5,10,50,100,500}; //硬币种类
int num[6]; //表示对应的硬币用了多少个
int res; //所需最少硬币数
int f(int A, int cur)
{
//尽量先用大面值,因为不用大面值,将使用更多的小面值硬币,一定得不到最优解
if(A <= 0)
{
return 0;
}
if(cur == 0)
{
num[cur]=A;
return A; //只用判断1块了,A是多少就用多少个1块
}
int coinValue = coins[cur]; //硬币面值
int x = A/coinValue; //最多可以选x张
int cnt = cnts[cur]; //实际有 cnt张
int t = min(x,cnt); //用 t张
num[cur]=t;
return t + f(A-t*coinValue,cur-1); //在判断下一个面值的
}
int main()
{
//初始化
for(int i=0; i<6; i++)
{
cin >> cnts[i];
}
int A; //money
cin >> A;
res = f(A,5); //从大到小选(cnts[5]开始判断)
cout <<"最少花 " << res << " 个硬币就可以解决\n" << endl;
cout << "明细:\n";
for(int i=0; i<6; i++)
{
cout << " " << coins[i] << "元用了 " << num[i] << " 个" << endl;
}
cout << endl;
return 0;
}