要求:上一题是最少硬币个数,这一题是种数,要相加
思路:
法一:完全背包,dp[i][j],j为总额
class Solution {
public:
int change(int amount, vector<int>& coins) {
vector<int> dp(amount+1);
dp[0]=1;
for(auto& coin:coins)
for(int j=coin;j<=amount;++j)
dp[j]=dp[j]+dp[j-coin];
return dp[amount];
}
};
法二:动规,以下为错误解法,coin放外面不重复{1,5}{5,1}
class Solution {
public:
int change(int amount, vector<int>& coins) {
vector<int> dp(amount+1);
dp[0]=1;
for(int j=1;j<=amount;++j)
for(auto& coin:coins)
if(j>=coin)
dp[j]+=dp[j-coin];
return dp[amount];
}
};