class Solution {
public:
int change(int amount, vector<int>& coins) {
/*
题意分解:
假设每一种面额的硬币有无限个,返回可以凑成总金额amount的硬币组合数
-> 完全背包问题,背包容量为amount, dp[amount]为可以凑成总金额amount的硬币组合数
dp[j]: 在coins中选择可放回的硬币组合,使其总金额为 j,得到的最大组合数为dp[j]
dp[j] = max(不选择该种硬币,选择该种硬币) | dp[j](amount < coins[i],这里直接不更新dp[j]即可);
dp[j] = max(dp[j], dp[j - coins[i]] + dp[j])
*/
vector<int> dp(5001,0);
dp[0] = 1; //初始化,总金额为0,即所有硬币都不选,只有一种
for(int i = 0; i < coins.size(); i ++){
for(int j = coins[i]; j <= amount; j ++){ //从小到大遍历金额,确保每种状态都可以被该硬币更新
dp[j] = max(dp[j], dp[j - coins[i]] + dp[j]);
}
}
return dp[amount];
}
};
<Talk is cheap, show me the code 13> LeetCode.518 零钱兑换
最新推荐文章于 2024-09-10 23:34:31 发布