动态规划
一、零钱兑换 II
问题转化为有多种硬币组合可以达到目标值,完全背包且组合问题
class Solution {
public:
int change(int amount, vector<int>& coins) {
//完全背包
//dp[j] 表示装满j由dp[j]种方法
vector<int>dp(amount+1, 0);
dp[0] = 1;
for (int i = 0; i < coins.size(); i++) {
for (int j = coins[i]; j <= amount; j++) {
dp[j] += dp[j - coins[i]];
}
}
return dp[amount];
}
};
二、组合总和 Ⅳ
问题转化为有多种排列方式使得达到目标值,完全背包且排列问题
组合和排列问题的关键在于遍历顺序不同
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
//完全背包,装满有多少种方法
vector<int>dp(target+1, 0);
dp[0] = 1;
for (int i = 0; i <= target; i++) {
for (int j = 0; j <nums.size(); j++) {
if (i >= nums[j] && dp[i] < INT_MAX - dp[i - nums[j]]) dp[i] += dp[i - nums[j]];
}
}
return dp[target];
}
};
总结
不算太难,稍微有点绕,需要手动模拟
学习时间90min。
学习资料:《代码随想录》。