山西省住房建设厅网站房屋建筑定额想做网站的公司好

张小明 2025/12/28 9:00:08
山西省住房建设厅网站房屋建筑定额,想做网站的公司好,seo网站推广案例,wordpress 收款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进行投诉反馈,一经查实,立即删除!

海珠营销型网站建设福建网站建设哪家专业

Tiled地图拼接实战指南:告别大型地图编辑烦恼 【免费下载链接】tiled 项目地址: https://gitcode.com/gh_mirrors/til/tiled 你是否曾经为处理庞大的游戏地图而头疼不已?地图文件过大导致加载缓慢、多人协作频繁冲突、编辑时卡顿不断……这些问题…

张小明 2025/12/28 9:00:06 网站建设

医院网站怎么做运营用什么程序做网站

Wan2.2-T2V-A14B在灾难应急演练视频自动生成中的作用 你有没有想过,一场地震应急演练的全过程,不需要真人出演、不用布景搭台,仅靠一段文字就能“自动播放”?🤯 这听起来像科幻片的情节,但今天,…

张小明 2025/12/28 8:58:29 网站建设

设计公司网站要包含什么信息网站添加百度搜索

SCAPS-1D太阳能电池仿真终极指南:从入门到精通完整教程 【免费下载链接】SCAPS-1D太阳能电池仿真软件 SCAPS-1D是一款专业的太阳能电池一维仿真工具,广泛应用于光伏领域的研究与开发。通过本软件,用户能够详细模拟和分析太阳能电池的结构、材…

张小明 2025/12/28 8:57:56 网站建设

前海艾爻网站 建设想自学软件开发难吗

数字孪生,作为一种将物理实体或系统在其全生命周期内,通过数据驱动在虚拟空间中构建动态镜像的技术,正深刻改变着众多行业的运作模式。它不仅是一个简单的三维模型,更是一个集成了实时数据、模拟分析、预测决策能力的综合系统。随…

张小明 2025/12/28 8:56:51 网站建设