我在动态编程方面遇到困难。我正在尝试琐碎的硬币改变问题 - 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;
}
}
我想知道我记忆错误或自上而下在这种情况下是不行的,而自下而上的方法是唯一的选择。
答案 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;
}