动态规划问题,也可以用记忆dfs做
//动态规划
int coinChange(vector<int>& coins, int amount) {
vector<int> dp(amount+1,0x3f3f3f3f);
dp[0] = 0;
for(int i = 1;i <= amount;i++)
{
for(int j:coins)
{
if(i-j>=0)
{
dp[i] = min(dp[i],dp[i-j]+1);
//cout<<i<<" "<<dp[i]<<endl;
}
}
}
return dp[amount]==0x3f3f3f3f?-1:dp[amount];
}
//自底而上dfs
int dp[100000], n;
int dfs(vector<int> &coins, long long cur)
{
if (cur > n)
return -1;
if (cur == n)
return 0;
if (dp[cur] != 0x3f3f3f3f)
return dp[cur];
for (int i = 0;i < coins.size();i++)
{
int temp = dfs(coins,cur+coins[i]);
if(temp != -1)
dp[cur] = min(dp[cur], temp + 1);
}
dp[cur] == 0x3f3f3f3f?dp[cur] = -1: dp[cur] = dp[cur];
return dp[cur];
}
int coinChange(vector<int>& coins, int amount) {
memset(dp, 0x3f, sizeof(dp));
n = amount;
return dfs(coins, 0);
}
//自顶而下的记忆dfs
int dp[100000];
int dfs(vector<int>& coins,long long cur)
{
if (cur == 0)
return 0;
if (cur < 0)
return -1;
if (dp[cur] != 0x3f3f3f3f)
return dp[cur];
for (int i : coins)
{
int temp = dfs(coins,cur - i);
if (temp != -1)
{
dp[cur] = min(dp[cur], temp + 1);
}
}
dp[cur] == 0x3f3f3f3f ? dp[cur] = -1 : dp[cur] = dp[cur];
return dp[cur];
}
int coinChange(vector<int>& coins, int amount) {
memset(dp, 0x3f, sizeof(dp));
return dfs(coins, amount);
}