题目描述:
硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007)
思路:
完全背包问题:
约束条件是:每个物品可以取无数次
而01背包问题是每个物品取一次
代码如下:
C++
class Solution {
public:
int waysToChange(int n) {
vector<int>dp(n+1,0);
vector<int>coins={1,5,10,25};
int mod=1e9+7;
dp[0]=1;
for(int i=0;i<coins.size();i++){
for(int j=coins[i];j<=n;j++){
dp[j]=(dp[j]+dp[j-coins[i]])%mod;
}
}
// for(int i=0;i<coins.size();i++){
// for(int j=1;j<=n;j++){
// if(coins[i]==j)
// dp[j]=dp[j]+1;
// else if(coins[i]<j)
// dp[j]=(dp[j]+dp[j-coins[i]])%mod;
// }
// }
return dp[n];
}
};
python:
class Solution:
def waysToChange(self, n: int) -> int:
coins=[1,5,10,25]
dp = [0]*(n+1)
dp[0]=1
for i in range(len(coins)):
for j in range(coins[i],n+1):
dp[j]+=dp[j-coins[i]]
return dp[n]%1000000007