随想录训练营Day44(原day42) | DP - - 完全背包理论, 518.零钱兑换II, 377. 组合总和 Ⅳ
标签: LeetCode闯关记
完全背包理论

518.零钱兑换II
思路
通过打印区别排列数和组合数
class Solution {
public int change(int amount, int[] coins) {
int[] dp = new int[amount+1];
for (int i : dp) {
i = 0;
}
dp[0] = 1;
for (int i = 0; i < coins.length; i++) {
for (int j = coins[i]; j <= amount ; j++) {
dp[j] += dp[j-coins[i]];
}
}
return dp[amount];
}
}
377. 组合总和 Ⅳ
思路: 完全背包 dp[i]表示组成总和为i的方法有dp[i]种,此为排列数 递推公式dp[i] += dp[i-nums[j]] 初始化:因为递推公式dp[i] += dp[i - nums[j]]的缘故,dp[0]要初始化为1,这样递归其他dp[i]的时候才会有数值基础。 遍历顺序: 先包后物品(排列数),正序(完全背包)
class Solution {
public int combinationSum4(int[] nums, int target) {
int[] dp = new int[target+1];
dp[0] = 1;
for (int i = 1; i <= target; i++) {
for (int j = 0; j < nums.length; j++) {
if(i >= nums[j]){
dp[i] += dp[i-nums[j]];
}
}
}
return dp[target];
}
}
通过打印区别排列数和组合数
