概述
dp方程的推导过程如下:
// dp[i][j] = dp[i-1][j] + dp[i-1][j-coins[i]] + dp[i-1][j-2coins[i]] + ...
// dp[i][j-coins[i]] = dp[i-1][j-coins[i]]+ ... +
// dp[i][j] = dp[i-1][j] + dp[i][j-coins[i]]
class Solution {
public:
int change(int amount, vector<int>& coins) {
int n = coins.size();
vector<vector<int>> dp(n + 1, vector<int>(amount + 1));
dp[0][0] = 1;
for(int i = 1; i <= n; i++) {
for(int j = 0; j <= amount; j++) {
if(j >= coins[i - 1]) {
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);
dp[0] = 1;
for(auto coin : coins) {
for(int j = 1; j <= amount; j++) {
if(j >= coin) {
dp[j] += dp[j - coin];
}
}
}
return dp[amount];
}
};
最后
以上就是甜蜜大碗为你收集整理的Leetcode 518 零钱兑换 II (dp背包方案数)的全部内容,希望文章能够帮你解决Leetcode 518 零钱兑换 II (dp背包方案数)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复