回 帖 发 新 帖 刷新版面

主题:急救,钱币问题,有个题不会做...(动态规划)

钱币兑零问题:设硬币面值有以下n种:C1>C2>.....>Cn(如50分,25分,10 分,5分,1分)。已知纸币面值X,确定一个将X兑换成硬币且使用最少硬币的方法。假设硬币的最小面值是1。使用动态规划方法
设计解决该问题的算法。给出算法描述。

我谢谢个位了! sos!!

回复列表 (共4个回复)

沙发

往年试卷上的一题,我只会用贪心法做,不知道如何用动态规划做.不知道怎么写出他的递推公式.感觉不好用动态规划做.还是请教一下大伙吧

板凳

// 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 楼


郁闷.今天考试还是这个题,不过要用回溯法做...时间那么短 题目那么多
哪里做的出啊?bt

4 楼

算法描述:
要求最少的数量:去f(num-c1),f(num-c2).....;.得最少的并且要储存,把递归的结果保存,就行了

我来回复

您尚未登录,请登录后再回复。点此登录或注册