目录
完全背包理论知识
文章讲解:代码随想录
视频讲解:带你学透完全背包问题! 和 01背包有什么差别?遍历顺序上有什么讲究?_哔哩哔哩_bilibili
LeetCode 518.零钱兑换II
文章讲解:代码随想录
视频讲解:动态规划之完全背包,装满背包有多少种方法?组合与排列有讲究!| LeetCode:518.零钱兑换II_哔哩哔哩_bilibili力扣题目:LeetCode 518.零钱兑换II
动态规划五步曲:
1.确定dp[j]的含义
dp[j]:一共有dp[j]种方法能够装满j金额
2.找出递推公式
dp[j] += dp[j-coins[i]];
3.初始化dp数组
dp[0] = 1;
4.确定dp的遍历顺序
外循环遍历物品,内循环遍历重量为组合问题。
外循环遍历重量,内循环遍历物品为排列问题。
内循环从前往后遍历。
5.打印dp数组
代码如下(Java):
class Solution {
public int change(int amount, int[] coins) {
int[] dp = new int[amount + 1];
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];
}
}
LeetCode 377.组合总和IV
文章讲解:代码随想录
视频讲解:动态规划之完全背包,装满背包有几种方法?求排列数?| LeetCode:377.组合总和IV_哔哩哔哩_bilibili力扣题目:LeetCode 377.组合总和IV
动态规划五步曲:
1.确定dp[i]的含义
dp[i]:一共有dp[i]种方法凑成整数i
2.找出递推公式
dp[i] += dp[i - nums[j]];
3.初始化dp数组
dp[0] = 1;
4.确定遍历顺序
外循环从0遍历到target,内循环遍历nums数组,这样才符合排列问题,最后内循环从前往后遍历即可。
5.打印dp数组
代码如下(Java):
class Solution {
public int combinationSum4(int[] nums, int target) {
int[] dp = new int[target + 1];
dp[0] = 1;
for(int i = 0; i <= target; i++){
for(int j = 0; j < nums.length; j++){
if(i >= nums[j]){
dp[i] += dp[i - nums[j]];
}
}
}
return dp[target];
}
}
本文介绍了动态规划在LeetCode中的两个经典问题:518.零钱兑换II和377.组合总和IV。详细讲解了完全背包理论,确定dp变量含义,递推公式,初始化和遍历顺序,以及如何编写Java代码实现。
468

被折叠的 条评论
为什么被折叠?



