动态规划的硬币变换算法

时间:2015-09-04 16:44:46

标签: algorithm

我在动态编程方面遇到困难。我正在尝试琐碎的硬币改变问题 - COIN CHANGE Problem UVa

我正在尝试使用自上而下的方法进行记忆,但我得到了TLE。这是我的代码 -

#include <bits/stdc++.h>
using namespace std;
#define ll long long

typedef vector <int > vi;
typedef vector <vi> vii;
const int maxn = 10000007;

int Set[maxn];
int Coin(int n,int m,vii & dp)
{   
    if(n==0)
        return 1;
    else if(n<0 || m<0)
        return 0;

    else if(dp[n][m]!=-1)
        return dp[n][m];
    else
    {
        dp[n][m]=Coin(n-Set[m],m,dp)+Coin(n,m-1,dp);

        return dp[n][m];
    }
}

int main()
{
    int n,m=5;
    Set[0]=50,Set[1]=25,Set[2]=10,Set[3]=5,Set[4]=1;
    while(scanf("%d",&n)!=EOF)
    {       
        vector <vector <int> > dp(n+1,vector<int> (m,-1));
        dp[0][0]=0;
        cout << Coin(n,m-1,dp) << endl;
    }
}

我想知道我记忆错误或自上而下在这种情况下是不行的,而自下而上的方法是唯一的选择。

1 个答案:

答案 0 :(得分:2)

你没有为每个测试用例(n的每个值)调用Coin函数,因为m(硬币类型的数量)在所有情况下都保持相同,因此只调用一次最大值,这里是7489。然后以dp [n] [4]的形式回答所有测试用例。请参阅下面的代码以便更好地理解。

n = 7489;
vector <vector <int> > dp(n+1,vector<int> (m,-1));
 dp[0][0]=0;
 Coin(n,m-1,dp);
while(scanf("%d",&n)!=EOF)
{       

    cout<<dp[n][4]<<endl;   
}