欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > 算法笔记|Day32动态规划V

算法笔记|Day32动态规划V

2024/10/24 17:21:26 来源:https://blog.csdn.net/m0_57632621/article/details/141420275  浏览:    关键词:算法笔记|Day32动态规划V

算法笔记|Day32动态规划V

  • ※※※※※完全背包问题理论
    • 基本题目描述
    • 题目分析
      • 采用一维数组(滚动数组)
  • ☆☆☆☆☆leetcode 518.零钱兑换II
    • 题目分析
    • 代码
  • ☆☆☆☆☆leetcode 377. 组合总和Ⅳ
    • 题目分析
    • 代码
  • ☆☆☆☆☆KamaCoder 57. 爬楼梯(待补充)
    • 题目分析
    • 代码

※※※※※完全背包问题理论

基本题目描述

有n件物品和一个最多能背重量为w的背包,第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品可以无限次使用,求解将哪些物品装入背包里物品价值总和最大。

题目分析

采用一维数组(滚动数组)

1.dp数组含义:j表示背包容量,dp[j]表示容量为j的背包最大的价值总和;
2.递推公式:dp[j]=Math.max(dp[j],[j-weight[i]]+value[i])(j>=weight[i])(如果能装下这个物品,若不放物品i:dp[j]不变化;若放物品i:由dp[j-weight[i]]推出,dp[j-weight[i]]为背包容量为j-weight[i]的时候的最大价值,那么dp[j-weight[i]]+value[i],就是背包放物品i得到的最大价值);
3.初始化:dp[0]=0(背包容量j为0,背包价值总和一定为0);
4.遍历顺序:基本的完全背包题目先遍历物品或背包均可以(应用类题目具体顺序与题意有关),背包容量一定是要正序遍历。

☆☆☆☆☆leetcode 518.零钱兑换II

题目链接:leetcode 518.零钱兑换II

题目分析

1.dp数组含义:dp[j]表示凑成总金额为j的货币组合数;
2.递推公式:dp[j]+=dp[j-coins[i]]
(以dp[j]其中j为5举例,要想凑成总金额为5的货币,要考虑以下情况:
已经有一个1(coins[i])的话,有dp[4]种方法凑成总金额为5的货币
已经有一个2(coins[i])的话,有dp[3]种方法凑成总金额为5的货币
已经有一个3(coins[i])的话,有dp[2]种方法凑成总金额为5的货币
已经有一个4(coins[i])的话,有dp[1]种方法凑成总金额为5的货币
已经有一个5(coins[i])的话,有dp[0]种方法凑成总金额为5的货币
那么凑整dp[5]的总方法数也就是把所有的dp[j - coins[i]]累加起来);
3.初始化:dp[0]=1;(考虑把容量为0也当做一种方法,这样可以递推得到其他结果。若dp[0]是0,递推结果将都是0)
4.遍历顺序:不涉及顺序(组合问题),先遍历货币嵌套遍历背包,背包一定是要正序遍历。

代码

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. 组合总和Ⅳ

题目链接:leetcode 377. 组合总和Ⅳ

题目分析

1.dp数组含义:dp[j]表示凑成目标正整数为i的排列个数;
2.递推公式:dp[j]+=dp[j-nums[i]]
(以dp[j]其中j为5举例,要想凑成总和为5,要考虑以下情况:
已经有一个1(nums[i])的话,有dp[4]种方法凑成总和为5
已经有一个2(nums[i])的话,有dp[3]种方法凑成总和为5
已经有一个3(nums[i])的话,有dp[2]种方法凑成总和为5
已经有一个4(nums[i])的话,有dp[1]种方法凑成总和为5
已经有一个5(nums[i])的话,有dp[0]种方法凑成总和为5
那么凑整dp[5]的总方法数也就是把所有的dp[j - nums[i]]累加起来);
3.初始化:dp[0]=1;(考虑把容量为0也当做一种方法,这样可以递推得到其他结果。若dp[0]是0,递推结果将都是0)
4.遍历顺序:涉及顺序(排列问题),先遍历背包嵌套遍历货币,背包一定是要正序遍历。

代码

class Solution {public int combinationSum4(int[] nums, int target) {int dp[]=new int[target+1];dp[0]=1;for(int j=1;j<=target;j++){for(int i=0;i<nums.length;i++){if(j>=nums[i])dp[j]+=dp[j-nums[i]];}}return dp[target];}
}

☆☆☆☆☆KamaCoder 57. 爬楼梯(待补充)

题目链接:KamaCoder 57. 爬楼梯

题目分析

代码


版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com