dp方程的推导方式:
然后可以将空间复杂度优化到O(n), 在面试中,一般只要求优化时间即可。
class Solution {
public:
const int mod = 1000000007;
int waysToChange(int n) {
// dp[i][n] 表示前i个数凑成n的方案数
// dp[i][n] = dp[i-1][n] + dp[i-1][n-nums[i]]+dp[i-1][n-2*nums[i]]
// dp[i][n] = dp[i-1][n] + dp[i][n-nuns[i]]
int nums[] = {1,5,10,25};
vector<vector<int>> dp(5,vector<int>(n+1));
for(int i=0;i<=4;i++) dp[i][0] = 1;
for(int i=1;i<=4;i++){
for(int j=1;j<=n;j++){
dp[i][j] = dp[i-1][j]%mod;
if(j>=nums[i-1]) {
dp[i][j]+=(dp[i][j-nums[i-1]])%mod;
dp[i][j]%=mod;
}
}
}
return dp[4][n];
}
};
class Solution {
public:
int change(int target, vector<int>& nums) {
int n = nums.size();
vector<int> dp(target+1);
dp[0] = 1;
for(int i=0;i<n;i++){
for(int j=0;j<=target;j++){
if(j>=nums[i]){
dp[j]+=dp[j-nums[i]];
}
}
}
return dp[target];
}
};