主题:急救,钱币问题,有个题不会做...(动态规划)
晓晓猫
[专家分:30] 发布于 2007-01-20 18:28:00
钱币兑零问题:设硬币面值有以下n种:C1>C2>.....>Cn(如50分,25分,10 分,5分,1分)。已知纸币面值X,确定一个将X兑换成硬币且使用最少硬币的方法。假设硬币的最小面值是1。使用动态规划方法
设计解决该问题的算法。给出算法描述。
我谢谢个位了! sos!!
最后更新于:2007-01-20 21:55:00
回复列表 (共4个回复)
沙发
晓晓猫 [专家分:30] 发布于 2007-01-20 18:31:00
往年试卷上的一题,我只会用贪心法做,不知道如何用动态规划做.不知道怎么写出他的递推公式.感觉不好用动态规划做.还是请教一下大伙吧
板凳
sunseed [专家分:20] 发布于 2007-01-21 13:40:00
// if (x == 面值一种) return 1;
// else MinCoin = 1 +MinCoin(x-比x小的面值);
#include <iostream>
using namespace std;
int MinCoin(const int * coin_value,int n,int Xleft){
for (int i = 0;i < n; i++)
if (Xleft == coin_value[i])
return 1;
for ( i = 0 ; i < n && coin_value[i] < Xleft;i++);
int *num_coin = new int [i];
int mincoin;
for (int j = 0;j < i;j++){
num_coin[j] = 1 + MinCoin(coin_value,i,Xleft - coin_value[j]);
if (j == 0)
mincoin = num_coin[0];
else
mincoin = mincoin > num_coin[j] ? num_coin[j] : mincoin;
}
delete num_coin;
return mincoin;
}
int main()
{
int N;
cin>>N;
int * coin_value = new int [N];
for (int i = N - 1;i >= 0;i--)
cin>>coin_value[i];
int X;
cin>>X;
cout<<MinCoin(coin_value,N,X)<<endl;
delete coin_value;
return 0;
}
3 楼
晓晓猫 [专家分:30] 发布于 2007-01-21 23:20:00
郁闷.今天考试还是这个题,不过要用回溯法做...时间那么短 题目那么多
哪里做的出啊?bt
4 楼
lt19870917 [专家分:750] 发布于 2007-01-22 16:35:00
算法描述:
要求最少的数量:去f(num-c1),f(num-c2).....;.得最少的并且要储存,把递归的结果保存,就行了
我来回复