代码随想录算法训练营 | 背包问题 二维,背包问题 一维,416. 分割等和子集

news/2024/10/9 22:57:31/文章来源:https://www.cnblogs.com/wowoioo/p/18455358

背包问题 二维
题目链接:背包问题 二维
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰背包问题 二维
日期:2024-10-09

想法:dp[i][j],i表示需要从物品0-i中选择加入到背包中,j表示背包的容量,dp值表示最大的价值;
递推公式,如果背包大小j都比此时要放的物品i的weight[i]小了,背包放不下物品i了,此时最大的价值就是上一个物品i-1的最大价值了即dp[i-1][j]; j>weight[i]时,j-weight表示将此时i的重量腾出来,而此时dp[i - 1][j-weight]大小就是空出物品i空间后的最大价值,加上value[i]就知道了dp[i][j]的一个可能值,当然还要跟dp[i-1][j]比一下大小,如果放了物品i价值更低了呢,所以递推公式就是dp[i][j] = Math.max(dp[i - 1][j - weight[i]] + value[i], dp[i - 1][j]);
初始化j=0时背包放不了任何东西,价值为0,即dp二维数组第一列初始化为0,第一行背包容量大于等于weight[0]时才能将物品0放入背包,即放入价值value[0],否则都是价值0;
遍历顺序:第一行第一列都初始化好了,从i=1,j=1开始,最后返回dp右下角值就行了
Java代码如下:

import java.util.Scanner;public class  Main {public static void main (String[] args) {Scanner scanner = new Scanner(System.in);int M = scanner.nextInt();int bagweight = scanner.nextInt();int[] weight = new int[M];int[] value = new int[M];for(int i = 0; i < M; i++) {weight[i] = scanner.nextInt();}for(int j = 0; j < M; j++) {value[j] = scanner.nextInt();}int[][] dp = new int[M][bagweight + 1];for(int i = weight[0]; i <= bagweight; i++) {dp[0][i] = value[0];}for(int i = 1; i < M; i++) {for(int j = 1; j <= bagweight; j++) {if(weight[i] > j) {dp[i][j] = dp[i - 1][j];}else {dp[i][j] = Math.max(dp[i - 1][j - weight[i]] + value[i], dp[i - 1][j]);}}}System.out.println(dp[M - 1][bagweight]);}
}

背包问题 一维
题目链接:背包问题 一维
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰背包问题 一维
日期:2024-10-09

想法:注意到二维数组的每一行的更新都是从上一行来的(都有个i - 1),那么只在同一行操作就能降低一维即递归变成:dp[j] = Math.max(dp[j - weight[i]] + value[i], dp[j])同样能达成目的。
Java代码如下:

import java.util.Scanner;public class  Main {public static void main (String[] args) {Scanner scanner = new Scanner(System.in);int M = scanner.nextInt();int bagweight = scanner.nextInt();int[] weight = new int[M];int[] value = new int[M];for(int i = 0; i < M; i++) {weight[i] = scanner.nextInt();}for(int j = 0; j < M; j++) {value[j] = scanner.nextInt();}int[] dp = new int[bagweight + 1];for(int i = 0; i < M; i++) {for(int j = bagweight; j >= weight[i]; j--) {dp[j] = Math.max(dp[j - weight[i]] + value[i], dp[j]);}}System.out.println(dp[bagweight]);}
}

总结:第一次写成了下面代码那样,对于背包容量依旧从小到大来,在背包只能放一个物品的时候没问题,但如果背包大小为2,物品0大小为1,我在设置背包容量为1的时候装了一次了即dp[1] = value[0]; 而到背包容量为2时计算dp[j - weight[i]] + value[i],这个dp[j - weight[i]] = dp[1],意思就是我会再装一次物品0来得到价值最大,这于物品放一次就不符合了,所以只能倒着遍历背包容量从j = bagweight开始,j >= weight[i]时就进入遍历公式,此时的dp[j - weight[i]] + value[i]依旧用的是之前没有变动过的数据,才能得到正确答案

import java.util.Scanner;public class  Main {public static void main (String[] args) {Scanner scanner = new Scanner(System.in);int M = scanner.nextInt();int bagweight = scanner.nextInt();int[] weight = new int[M];int[] value = new int[M];for(int i = 0; i < M; i++) {weight[i] = scanner.nextInt();}for(int j = 0; j < M; j++) {value[j] = scanner.nextInt();}int[] dp = new int[bagweight + 1];for(int i = 0; i < M; i++) {for(int j = 1; j <= bagweight; j++) {if(weight[i] > j) {continue;}else {dp[j] = Math.max(dp[j - weight[i]] + value[i], dp[j]);}}}System.out.println(dp[bagweight]);}
}

416. 分割等和子集
题目链接:416. 分割等和子集
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰分割等和子集
日期:2024-10-09

想法:背包问题初遇还是挺难的,此题中背包容量为target = sum / 2,物品i大小为nums[i],价值也是nums[i],最后判断dp[target] == target,等于就能找到。
Java代码如下:

class Solution {public boolean canPartition(int[] nums) {if(nums == null || nums.length == 0) return false;int sum = 0;for(int num : nums) {sum += num;}if(sum % 2 != 0) {return false;}int target = sum / 2;int[] dp = new int[target + 1];for(int i = 0; i < nums.length; i++) {for(int j = target; j >= nums[i]; j--) {dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);}}if(dp[target] == target) {return true;}else return false;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/810818.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js学习 -2024/10/9

今天学习了js中的一些知识 DOM 通过document.get...函数获取元素对象 可以查阅h3school资料找对象的函数,操作对象,//根据id获取元素对象 // let id = document.getElementById(back); // id.src = "../img/02.png";//根据标签获取元素对象 var divss = document.get…

渗透测试作业3

使用wireshark对同一网络下的qq信息进行抓包 首先我们需要知道的是因为qq为了保障消息的及时性,所以当两个设备在同一网域的时候,此时我们发的消息是不会经过保密的,这就给了我们很大的操作空间,那么接下来我会用两种方法来给大家展现一下如何在同一网络下,对QQ的信息进行…

《Programming from the Ground Up》阅读笔记:p181-p216

《Programming from the Ground Up》学习第10天,p181-p216总结,总计34页。 一、技术总结 第10章主要讲计算机是如何计算的,如十进制、二进制、八进制、十六进制以及浮点数和负数的表示。属于比较基础的内容,如果有一定基础,本章可跳过。 1.exponent & mantissa 示例:…

# 20222323 2024-2025-1 《网络与系统攻防技术》实验一实验报告

1.实验内容 1、熟悉基本的汇编指令,如管道、输入、输出重定向 2、掌握了栈与堆的概念 3、掌握反汇编与十六进制编程器 实验任务 1、手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。 2、利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发get…

shctf [week1]poppopop

最近刚好在学pop链和反序列化,那就写一篇shctf做题的随笔吧 进来先审计代码;1.发现反序列化首先会调用__destruct()魔术方法,将$Web赋为true,并echo $n,显然在这里我们得再有一个魔术方法,又因为这里调用的n被当字符串输出,一眼看到__toString(),考虑把$n赋值为new F()…

一条命令激活Internet Download Manager

admin • 2023-09-12 上午7:03 • 免费资源, 杂谈 • 阅读 88使用Internet Download Manager可以使用如下命令激活在科学联网情况下,复制这条命令irm https://massgrave.dev/ias | iexWin8.1/Win10/Win11系统下,在windows徽标上单击鼠标右键,在弹出的菜单中选择”windows po…

2024/10/09 模拟赛总结

\(100+40+20+8=168\),拿到了大众分,至少没挂分吧 #A. 矩阵交换 一个 \(m\) 维偏序,可以使用 \(m-1\) 维树状数组解决 以第 \(i\) 作为第 \(i\) 关键字,进行排序,这样一定最优。排完之后直接判断是否满足条件即可 // BLuemoon_ #include <bits/stdc++.h>using namesp…

USB协议详解第12讲(USB传输-初探)

1.USB传输、事务、包的关系 USB传输、事务、包是从不同层次上去说明一次数据交互的三个概念。 举个例子可能更好些,"某领导和一个早起的程序员进行了一次交流,说了5件事"。 OK,其实这里的"这次交流"就相当于USB的一次传输,"说了5件事"就相当…

隧道云 cpolar

Dify+Ollama+llava大模型本地搭建个人AI知识库并实现远程访问 https://www.bilibili.com/video/BV1tu24YyEDh/?spm_id_from=333.337.search-card.all.click&vd_source=57e261300f39bf692de396b55bf8c41bcpolar https://www.cpolar.com/features什么是cpolar?cpolar是一种…

C++类

C++类 类 // public 成员提供类的接口,暴漏给外界,供外界使用 // private:提供各种实现类功能的细节方法,但不暴漏给使用者,外界无法使用 // 注意:struct 是成员默认为 public 的 class、class 成员默认是 private class student{ public:int number;char name[100]; …

SE_Paring_Work2

目录具体分工 PSP表格 解题思路描述与设计实现说明3.1 团队作业功能的实现思路 3.2 关键实现的流程图 3.3 重要/有价值的代码片段附加特点设计与展示4.1 设计的创意独到之处及意义 4.2 实现思路 4.3 重要/有价值的代码片段目录说明和使用说明5.1 目录的组织 5.2 如何运行单元测…

PasteForm最佳CRUD实践,实际案例PasteTemplate详解之3000问(四)

无论100个表还是30个表,在使用PasteForm模式的时候,管理端的页面是一样的,大概4个页面, 利用不同操作模式下的不同dto数据模型,通过后端修改对应的dto可以做到控制前端的UI,在没有特别特殊的需求下可以做到快速的实现CRUD! 免去版本兼容问题,免去前后端不一致的问题,免…