算法训练营Day42(背包问题)

基础

非竞赛只需要搞懂0-1背包和完全背包

0-1背包基础

0-1背包是完全背包和多重背包的基础

n个物品,每个物品一个,每个物品有自己的重量和价值,,一个背包能装m物品,问最多装多少物品。

暴力解法,n个物品,2^n

dp数组:

可以二维,也可以优化成一维

二维

dp[i][j]:  0-i的0物品任选一个放到背包j中,价值总和最大是多少

递推公式

dp[i][j]

不放物品i,,物品是 i 背包为j,最大价值,

        dp[i-1][j]:不放物品i的最大价值。

放物品i: 物品为i-1{代表从0到i-1中选物品,所以物品i已经被放到背包}          

        dp[i-1]dp[j-weight[i]+value[i] 

        {i-1代表0到i个物品,去掉i, 

         j-weight[i]{代表物品i放入背包,剩下的重量为这个}

        value[i]   :物品的价值

        dp[i-1][j-weight[i]]代表放入物品i,剩下物品的最大价值

        两者相加就是当前背包的最大价值。

物品只有放与不放,所以递推公式:

        dp[i][j] = Math.max(dp[i-1][j],Math.max(dp[i-1][j-weight[i]+value[i]))

初始化

dp[i][j]由上面{dp[i-1][j]}推除,或者左上角推出

还是初始化第一列和第一行

背包容量为0的时候,什么也不能放了,物品0到i都是初始化为0

第一行,这个要初始化的时候要看物品0的重量,如果为3

那么3 4这两个要初始化成value[0]

也就是weight[0]到i初始化成value[0]

遍历顺序

先遍历哪个都可以,因为从左上和上遍历,这两个都可以通过递推公式遍历完

代码

public class BagProblem {public static void main(String[] args) {int[] weight = {1,3,4};int[] value = {15,20,30};int bagSize = 4;testWeightBagProblem(weight,value,bagSize);}/*** 动态规划获得结果* @param weight  物品的重量* @param value   物品的价值* @param bagSize 背包的容量*/public static void testWeightBagProblem(int[] weight, int[] value, int bagSize){// 创建dp数组int goods = weight.length;  // 获取物品的数量int[][] dp = new int[goods][bagSize + 1];// 初始化dp数组// 创建数组后,其中默认的值就是0for (int j = weight[0]; j <= bagSize; j++) {dp[0][j] = value[0];}// 填充dp数组for (int i = 1; i < weight.length; i++) {for (int j = 1; j <= bagSize; j++) {if (j < weight[i]) {/*** 当前背包的容量都没有当前物品i大的时候,是不放物品i的* 那么前i-1个物品能放下的最大价值就是当前情况的最大价值*/dp[i][j] = dp[i-1][j];} else {/*** 当前背包的容量可以放下物品i* 那么此时分两种情况:*    1、不放物品i*    2、放物品i* 比较这两种情况下,哪种背包中物品的最大价值最大*/dp[i][j] = Math.max(dp[i-1][j] , dp[i-1][j-weight[i]] + value[i]);}}}// 打印dp数组for (int i = 0; i < goods; i++) {for (int j = 0; j <= bagSize; j++) {System.out.print(dp[i][j] + "\t");}System.out.println("\n");}}
}

0-1背包-一维数组

压缩原理

因为每一层都是由上一层得到的,所以可以先拷贝到,通过滚动数组的形式实现原地修改!

dp数组含义

dp[j]       :  容量为j时,背包最大价值为dp[j]

递推公式

不放物品i,因为这个数组是上一层拷贝下来的,上一层比如,物品1,那么这一层是物品2,直接拷贝下来,是不包含物品2的,

所以不妨物品i   :容量为j时,背包的最大价值就是dp[j]  {也就是抛去物品i的最大价值}

放物品i时:  

        容量肯定要编程j-weight[j]的,现在放物品i,当前逻辑就要加上i的价值value[i]

        {{{其实从最开始,初始化,后面价值的总和都是加这个value[i]得到的

        所以最大价值时dp[j-weight[i]] 

所以递推公式为:

        dp[j] = Math.max(dp[j],dp[j-weight]+value[i]){物理上就是数组当前位置和左面-weight位置}

初始化

容量为0 那么价值肯定0

所以初始化,dp[0]=0;

非0 的话,会被覆盖,默认为0就可

遍历顺序

现在数组是上一层的结果,想要倒叙遍历得到才是正常的计算

代码

 public static void main(String[] args) {int[] weight = {1, 3, 4};int[] value = {15, 20, 30};int bagWight = 4;testWeightBagProblem(weight, value, bagWight);}public static void testWeightBagProblem(int[] weight, int[] value, int bagWeight){int wLen = weight.length;//定义dp数组:dp[j]表示背包容量为j时,能获得的最大价值int[] dp = new int[bagWeight + 1];//遍历顺序:先遍历物品,再遍历背包容量for (int i = 0; i < wLen; i++){for (int j = bagWeight; j >= weight[i]; j--){dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);}}//打印dp数组for (int j = 0; j <= bagWeight; j++){System.out.print(dp[j] + " ");}}

416. 分割等和子集

416. 分割等和子集 - 力扣(LeetCode)

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;//dp数组 :含义:容量为j时,最大价值为dp[j]int [] dp = new int[target+1];//初始化//默认为0即可//遍历顺序//先遍历物品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]);}}return dp[target] == target;}}

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

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

相关文章

Acwing845 八数码

在2019年y神认为是困难题&#xff0c;2023年便是中等题了。。。嗯。。。 题目 在一个 33的网格中&#xff0c;1∼8 这 8个数字和一个 x 恰好不重不漏地分布在这 33 的网格中。 例如&#xff1a; 1 2 3 x 4 6 7 5 8在游戏过程中&#xff0c;可以把 x 与其上、下、左、右四个…

SpringMVC 的入门

SpringMVC 的入门 1环境搭建 1.1.创建工程 1.2.添加web支持 右键项目选择Add framework support... 2.添加web支持 ​ 3.效果 注意&#xff1a; 不要先添加打包方式将web目录要拖拽到main目录下&#xff0c;并改名为webapp 1.3.pom.xml <?xml version"1.0&q…

鱼哥赠书活动第⑥期:《内网渗透实战攻略》看完这本书教你玩转内网渗透测试成为实战高手!!!!

鱼哥赠书活动第⑥期&#xff1a;《内网渗透实战攻略》 如何阅读本书&#xff1a;本书章节介绍&#xff1a;本书大致目录&#xff1a;适合阅读对象&#xff1a;赠书抽奖规则:往期赠书福利&#xff1a; 当今&#xff0c;网络系统面临着越来越严峻的安全挑战。在众多的安全挑战中&…

7双指针问题-接雨水2

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表…

控制注塑机PQ比例阀放大器

控制不带电反馈的单或双比例电磁铁的博世力士乐&#xff08;Bosch Rexroth&#xff09;、伊顿威格士&#xff08;EATON Vickers&#xff09;、油研&#xff08;YUKEN&#xff09;、贺德克&#xff08;HYDAC&#xff09;、大金&#xff08;DAIKIN&#xff09;、不二越&#xff0…

ubuntu系统笔记导览

本笔记主要是为了方便查找和回顾学习&#xff0c;如果后续该系列更新时会同步更新在此导览中。 ubuntu系统中Error&#xff1a;No space left on device&#xff0c;解决办法&#xff1a;挂载大容量sda分区_unbuntu编译报错设备上没空间-CSDN博客 ubuntu系统&#xff08;2&am…

网安入门13-文件上传(htaccess,其他绕过)

空格绕过&#xff0c;点号绕过 Pass-07 直接上传肯定是失败的 把文件名1.php改成1.php.或1.php_(下划线为空格)&#xff0c;这种命名方式在windows系统里是不被允许的&#xff0c;所以需要在burp之类里进行修改&#xff0c;然后绕过验证后&#xff0c;会被windows系统自动去掉…

数据库-列的类型-浮点数,定点数-数据类型

类型占用空间负数取值范围正数取值范围FLOAT4 字节-3.4 x 10^383.4 x 10^38DOUBLE8 字节-1.8 x 10^3081.8 x 10^308DECIMAL(M,d)M2-1.8 x 10^3081.8 x 10^308 M表示数字的总位数&#xff0c;而d表示小数点后的位数 d不能大于m&#xff1b; 创建表 不指定精度 # 创建表 crea…

三维猴打印PCB外壳预留板壳间距

3D文件下单那里有一个“3D模型设计规范”&#xff0c;里面详细讲了设计时要考虑打印的参数细节。如果有其他的设计规范不了解的也可以进去查看&#xff0c;里面写的很详细。 这里是打印PCB外壳预留板壳间距相关说明&#xff1a; 设计模型为装配体&#xff0c;请务必满足装配最…

什么是springmvc(介绍)

什么是springmvc 1. 什么是springmvc2.项目中加入springmvc支持2.1 导入依赖2.2 springMVC配置文件2.3 web.xml配置2.4 中文编码处理 3. 编写一个简单的controller4. 视图层配置4.1 视图解析器配置4.2 静态资源配置4.2 编写页面4.3 页面跳转方式 5. SpringMVC处理请求的流程6. …

纯血鸿蒙「扩圈」100天,酝酿已久的突围

坦白讲&#xff0c;去年参加华为开发者大会看到HarmonyOS NEXT&#xff08;仅运行鸿蒙原生应用&#xff0c;所以也称作「纯血鸿蒙」&#xff09;的时候&#xff0c;小雷也没料想到鸿蒙原生应用生态的发展速度会如此之快。 9月25日&#xff0c;华为正式对外宣布启动HarmonyOS NE…

【C语言】指针——从底层原理到应用

C语言指针-从底层原理到花式技巧&#xff0c;用图文和代码帮你讲解透彻 目录 一、前言二、变量与指针的本质 1. 内存地址2. 32位与64位系统3. 变量4. 指针变量5. 操作指针变量 5.1 指针变量自身的值5.2 获取指针变量所指向的数据5.3 以什么样的数据类型来使用/解释指针变量所指…

Python学习笔记-使用Anaconda+VSCode配置开发环境

文章目录 概述一、安装Anaconda1.1 下载软件1.2 安装anaconda1.3 配置环境 二、配置虚拟环境2.1 使用conda创建一个新的虚拟环境2.1.1 使用search指令查看支持的python的版本&#xff1a;2.1.2 使用create创建指定版本的虚拟环境&#xff1a;2.1.3 使用env list查看虚拟环境列表…

2024年软考选哪科?什么时候考试?

软考是指计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff0c;是由中国工业和信息化部&#xff08;前身为工信部&#xff09;以及人力资源和社会保障部&#xff08;前身为人社部&#xff09;领导下的国家级考试。 软考共设有27个不同的资格类别&#xf…

Redis 为什么是单线程的?

Redis 为什么是单线程的&#xff1f; Redis 之所以选择单线程模型&#xff0c;主要是出于性能和设计上的考虑。以下是一些解释为什么 Redis 采用单线程模型的原因&#xff1a; 内存密集型操作&#xff1a; Redis 主要用于执行内存密集型操作&#xff0c;例如读写操作都在内存中…

8大基本类型的转换和运算符

类型间的转换&#xff1a; 基本类型由小到大依次为&#xff1a; ​ byte----short----int----long----float----double ​ char---- 两种方式&#xff1a; - 自动/隐式类型转换&#xff1a;小类型到大类型 - 强制类型转换&#xff1a;大类型到小类型 ​ 语法&am…

解密TF-IDF:打开文本分析的黑匣子

1.TF-IDF概述 TF-IDF&#xff0c;全称是“Term Frequency-Inverse Document Frequency”&#xff0c;中文意为“词频-逆文档频率”。这是一种在信息检索和文本挖掘中常用的加权技术。TF-IDF用于评估一个词语对于一个在语料库中的文件集或一个语料库中的其中一份文件的重要程度…

BigDecimal使用记录

在公司经费这块用到了BigDecimal类&#xff0c;特此整理记录一下。 一、BigDecimal简介&#xff1a; float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算&#xff0c;这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而&a…

vulhub中的Apache HTTPD 多后缀解析漏洞详解

Apache HTTPD 多后缀解析漏洞 1.查看python版本 这里python版本很重要&#xff0c;因为版本过低可能会导致后面的结果运行不成功 这里我就遇到了因为版本过低而执行不了docker-compose up -d的情况 查看python版本 cd /usr/bin ls -al python* 当版本过低时安装高版本的 …

_Incapsula_Resource与Rc4混淆分析

一、获得混淆js 这么一个地址 https://www.interasia.cc/_Incapsula_Resource?SWJIYLWA5074a744e2e3d891814e9a2dace20bd4,719d34d31c8e3a6e6fffd425f7e032f3 浏览器打开这个地址 复制这个js&#xff0c;到浏览器调试 先格式化查看&#xff0c;也就是一个eval函数执行b函数 …