看这道题,一开始想着用有点类似斐波那契数列数组去做,f[n]=sum(f[n-cion[i]])。但是列了一下发现不行,有重合情况。这是想着用一行数组去解决,自然不行,
所以还是对动态规划不清楚,最原始的是要列mXn行。
dp[i][j]=dp[i-1][j]+dp[i][j-coins[i-1]]。这里的道理自己也说的不清楚。首先第一项肯定是不选第i个硬币的情况的,等于dp[i-1][j]这没什么问题,接下来是dp[i][j-coins[i-1]]。这一项是什么呢?是在使用第i个硬币的情况,但为什么是在第i行呢?我能写出来,却无法阐述清楚。模模糊糊的感觉到是为了避免重复的情况。
class Solution {
public:
int change(int amount, vector<int>& coins) {
int n=coins.size();
vector<int> v(amount+1,0);
v[0]=1;
vector<vector<int> > dp(n+1,v);
for(int i=1;i<=n;++i)
for(int j=1;j<=amount;++j)
{
if(coins[i-1]<=j)
dp[i][j]=dp[i-1][j]+dp[i][j-coins[i-1]];
else
dp[i][j]=dp[i-1][j];
}
return dp[n][amount];
}
};
仍然可以状态压缩一下
class Solution {
public:
int change(int amount, vector<int>& coins) {
int n=coins.size();
vector<int> dp(amount+1,0);
dp[0]=1;
for(int i=1;i<=n;++i)
for(int j=1;j<=amount;++j)
{
if(coins[i-1]<=j)
dp[j]=dp[j]+dp[j-coins[i-1]];
}
return dp[amount];
}
};