做文字图网站专业做网站制作

张小明 2026/1/12 3:58:19
做文字图网站,专业做网站制作,中国最大的招标网,响应式网站服务KamaCoder 52 携带研究材料 题目链接#xff1a;52.携带研究材料 文档讲解#xff1a;代码随想录 视频讲解#xff1a;携带研究材料 思路与感想#xff1a;这道题目是一道纯完全背包题#xff0c;携带研究材料在之前纯01背包题目的时候已经做过了#xff0c;区别就在于物…KamaCoder 52 携带研究材料题目链接52.携带研究材料文档讲解代码随想录视频讲解携带研究材料思路与感想这道题目是一道纯完全背包题携带研究材料在之前纯01背包题目的时候已经做过了区别就在于物品能不能重复选。首先对于二维DP数组写法题意的改动造成了代码的两处修改。第一处就是在DP数组的第一行初始化上由于物品可以重复选择了所以不像之前01背包遇到能放物品0的容量就把dp值置为物品0的value就一劳永逸了这里需要考量的是背包容量能放几个物品0就尽可能放。所以代码是dp[0][i] dp[0][i - weight[0]] value[0];这个代码是比较巧妙的一开始看还怕如果物品0重量不是1而是2或者3造成背包中不是连续装物品0会不会出错但事实上这个代码考虑到了这一点所以在举例子的时候也可以按照预想思路填充背包。第二处修改在于递推公式上由于物品可以重复选择所以求最大值时在选择物品i的情况下在为背包预留了物品i的空间后仍然可以在0-i物品中选择所以递推公式就是dp[i][j] Math.max(dp[i - 1][j],dp[i][j - weight[i]] value[i])。区别就是选择物品i后不是i-1了而依旧是i。那对于一维DP滚动数组写法呢除了这两个区别外还有一处区别是遍历背包的时候必须正序遍历了因为物品可以重复选value可以重复加而不是之前只能选一次而且正因为这个遍历顺序都为正序了遍历物品和遍历背包的两层for循环也可以颠倒了。以上就是纯完全背包代码的修改总体而言还是跟01背包非常相像的有了01背包的基础理解起来还是很轻松的。收获1.理解纯完全背包的变化// 二维DP数组 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); int n sc.nextInt(); // 接收物品种类数量 int bagSpace sc.nextInt(); // 接收背包最大容量 int[] weight new int[n]; // 记录每个物品的重量 int[] value new int[n]; // 记录每个物品的价值 for (int i 0; i n; i) { // 接收物品的重量和价值数组 weight[i] sc.nextInt(); value[i] sc.nextInt(); } int[][] dp new int[n][bagSpace 1]; // 定义dp数组dp[i][j]下标含义为从0-i物品中任选可重复选择背包容量j能装的最大价值。顺便初始化第一列都为因为背包容量0什么也装不了 for (int i weight[0]; i bagSpace 1; i) { // 初始化第一行自能装物品0开始只要背包容量有空余就装物品0 dp[0][i] dp[0][i - weight[0]] value[0]; } for (int i 1; i n; i) { // 遍历物品和背包顺序都要正序谁外谁内无所谓物品0已经初始化从物品1开始遍历 for (int j 0; j bagSpace 1; j) { // 遍历背包正序是保证每个物品可以重复选择 if (j weight[i]) { dp[i][j] Math.max(dp[i - 1][j],dp[i][j - weight[i]] value[i]); // 可以选择。不放物品i就是从0-(i-1)物品中选放物品i要事先预留背包容量-weight[i]但依然是从0-i物品中选择因为每个物品可以重复选然后加上物品i的value } else { dp[i][j] dp[i - 1][j]; // 背包容量放不了物品i无法选择 } } } System.out.println(dp[n - 1][bagSpace]); sc.close(); } }// 一维DP滚动数组 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); int n sc.nextInt(); // 接收物品种类数量 int bagSpace sc.nextInt(); // 接收背包最大容量 int[] weight new int[n]; // 记录每个物品的重量 int[] value new int[n]; // 记录每个物品的价值 for (int i 0; i n; i) { // 接收物品的重量和价值数组 weight[i] sc.nextInt(); value[i] sc.nextInt(); } int[] dp new int[bagSpace 1]; // 定义dp数组 for (int i 0; i n; i) { // 遍历物品和背包顺序都要正序谁外谁内无所谓 for (int j weight[i]; j bagSpace 1; j) { // 遍历背包正序是保证每个物品可以重复选择 dp[j] Math.max(dp[j],dp[j - weight[i]] value[i]); // 可以选择。不放物品i就是从0-(i-1)物品中选放物品i要事先预留背包容量-weight[i]但依然是从0-i物品中选择因为每个物品可以重复选然后加上物品i的value } } System.out.println(dp[bagSpace]); sc.close(); } }LeetCode 518 零钱兑换 Ⅱ题目链接518.零钱兑换 Ⅱ文档讲解代码随想录视频讲解零钱兑换 Ⅱ思路与感想一开始看到题目要求的东西凑成总金额的方法数量我一下子就想到昨天总结时的两道题目一道是等和子集这里面是看能不能装满背包对应这里能不能凑满总金额。另一道是目标和这里求的是装满这个容量left的背包有多少种方式对应这里就是凑满总金额有多少种方式。根据题意我选择了用后者目标和的递推公式然后由于硬币可以重复选所以用了完全背包的模板再遍历背包的时候也正序遍历不出意外题目就通过了。看卡哥视频讲解的时候才发现有一个细节我是没有注意到的那就是遍历物品和背包两个for循环不能颠倒因为题目求的是是零钱兑换的组合方式所以一定要先遍历物品这样在选择物品的时候方法情况里面只会出现12不会出现21但是如果是先遍历背包再遍历物品那每一个背包容量都会遍历一次12那在方法情况中就可能出现21那这样就会重复相当于求的是排列情况了。所以这道题目一定要先遍历物品再遍历背包。收获1.完全背包应用2.求组合与排列时完全背包的两层for循环内外有讲究// 一维DP数组 class Solution { public int change(int amount, int[] coins) { int[] dp new int[amount 1]; // 定义DP数组dp[j]含义为装满容量为j的背包一共有多少种方法 dp[0] 1; // 初始化装满容量为j的背包有一种方法 for (int i 0; i coins.length; i) { // 遍历物品 for (int j coins[i]; j amount 1; j) { // 遍历背包 dp[j] dp[j - coins[i]]; // 递推累加。eg遍历到coin 1时dp[4] dp[5]遍历到coin 2时dp[3] dp[5]...围绕dp含义 } } return dp[amount]; } }LeetCode 377 组合总和 Ⅳ题目链接377.组合总和 Ⅳ文档讲解代码随想录视频讲解组合总和 Ⅳ思路与感想这道题目本质上还是求装满一个完全背包有多少种方法与上一道题目的区别在于上一题求的是组合这一题看似题目求组合实则是求排列那代码上的区别就确定了那就是先遍历背包再遍历物品都从0开始遍历递推的时候加一个条件判断即可通过。收获1.装满一个背包有多少种方法的完全背包应用求排列// 一维DP数组求排列 class Solution { public int combinationSum4(int[] nums, int target) { int[] dp new int[target 1]; // 定义dp数组装满容量j的背包有多少种方法 dp[0] 1; // 初始化 for (int j 0; j target 1; j) { // 求排列先遍历背包 for (int i 0; i nums.length; i) { // 再遍历物品 if (j nums[i]) { // 容量大于i的占位空间才能加 dp[j] dp[j - nums[i]]; // 递推累加 } } } return dp[target]; } }KamaCoder 57 爬楼梯题目链接57.爬楼梯文档讲解代码随想录视频讲解爬楼梯思路与感想这道题是之前爬楼梯的进阶版从原来的只能爬1阶或2阶到现在能够爬1-m阶然后求爬到楼顶一共有多少种方式。题意是简单的关键是要识别出进阶之后的爬楼梯实质上可以转换为完全背包而且爬楼梯的不同方式实质上是求排列。总楼梯数可以看作完全背包容量爬几阶可以看作物品那就跟上一题一摸一样了。收获1.进阶爬楼梯转换为完全背包求排列// 一维DP滚动数组求完全背包排序 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); int n sc.nextInt(); // 接收楼梯总阶数 int m sc.nextInt(); // 接收一次最多能爬多少阶 int[] dp new int[n 1]; // 定义dp数组爬到第j阶一共有多少种方法 dp[0] 1; // 初始化 for (int j 0; j n 1; j) { // 完全背包求排序先遍历背包 for (int i 1; i m 1; i) { // 再遍历物品一次能爬的阶数 if (j i) { // 必须容量大于一次性能爬的阶数 dp[j] dp[j - i]; // 递推累加 } } } System.out.println(dp[n]); sc.close(); } }今天的四道题目虽然是完全背包的开始但是因为有了前面01背包的基础所以写的很快而且基本上靠自己就能全部AC掉。大概花了三个小时多一点。把昨天任务给补完了今天还有一点完全背包的剩余以及了解一下多重背包背包问题就算是收尾了总体来讲还是01背包打基础的时候比较痛苦过掉了之后难的就是背包的应用了也就是如何把题意转换成背包场景这是最难的至于代码部分都是那么几套模板对应不同递推公式。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

青岛快速建站模板传奇竖版手游

3步快速完成老设备升级:OpenCore-Legacy-Patcher让旧Mac焕发新生 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为老款Mac无法升级最新系统而烦恼吗&…

张小明 2026/1/10 10:02:25 网站建设

以下什么是网络营销的特点纯手工seo公司

高校实验室教学管理 目录 基于springboot vue高校实验室教学管理系统 一、前言 二、系统功能演示 详细视频演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取: 基于springboot vue高校实验室教学…

张小明 2026/1/10 10:24:14 网站建设

国外的模板网站有哪些宜宾金农投资建设集团网站

PyTorch模型序列化保存:state_dict与full save区别 在深度学习工程实践中,一个训练好的模型如何被“固化”下来,直接决定了它能否顺利从实验环境走向真实业务场景。你有没有遇到过这样的情况:本地训练好的模型,部署到服…

张小明 2026/1/11 11:44:49 网站建设

知名网站的org域名网站制作行业

LobeChat与安卓TV结合:客厅里的AI语音助手 在智能家居设备日益复杂的今天,越来越多的家庭开始思考一个问题:我们真的需要把每一次提问都上传到云端吗?当孩子问“恐龙是怎么灭绝的”,或者老人想听一段新闻播报时&#x…

张小明 2026/1/10 10:24:16 网站建设

免费商标logo在线制作软件seo翻译

Miniconda-Python3.10中配置CUDA和cuDNN的正确方式 在深度学习项目开发中,最令人头疼的往往不是模型设计或调参,而是环境配置——尤其是当多个项目依赖不同版本的PyTorch、TensorFlow、CUDA甚至Python时。你是否经历过这样的场景:好不容易跑通…

张小明 2026/1/9 15:54:49 网站建设