0-1背包问题-例题

题目摘自《卡码网》46题

题意理解

        m种材料——对应m物品

        大小问n的行李箱——对应大小为n的背包

        所以该问题是一个0-1背包问题,采用动态规划的一般思路来解题。

解题思路

        动规五部曲:

        (1)定义二维dp数组,明确dp[i][j]的定义

                dp[i][j]表示编号在[0,i]的物品任取,放入大小为j的背包内,所得的最大价值

        (2)递推公式:

                dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+values[i])

        (3)初始化:根据递推公式可以看出,总是由左边和上边推导当前的数值,所以初始化第一行第一列。

        (4)遍历顺序:先物品后背包,先背包后物品都可以,因为二维dp数组保留了两个维度所有值。

        (5)打印结果,debug.

1.二维dp数组解决0-1背包问题

import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc=new Scanner(System.in);int m,n=0;m=sc.nextInt();n=sc.nextInt();int[] volumeArr=new int[m];int[] valuesArr=new int[m];for(int i=0;i<m;i++) volumeArr[i]=sc.nextInt();for(int i=0;i<m;i++) valuesArr[i]=sc.nextInt();Main obj=new Main();System.out.println(obj.sloveBagProblem(n,volumeArr,valuesArr));}public int sloveBagProblem(int bagSize,int[] volumeArr,int[] valuesArr){//定义dp数组int dp[][]=new int[volumeArr.length][bagSize+1];for (int i = 0; i <volumeArr.length; i++) {Arrays.fill(dp[i], -1);}//初始化-第一列:背包大小为0for(int i=0;i<valuesArr.length;i++) dp[i][0]=0;//初始化-第一行:能放入则放入for(int j=1;j<=bagSize;j++){if(volumeArr[0]>j){dp[0][j]=0;}else{dp[0][j]=valuesArr[0];}}//遍历:双for循环for(int i=1;i<volumeArr.length;i++){for(int j=1;j<=bagSize;j++){//判断是否能否加入if(volumeArr[i]>j){//不能放入dp[i][j]=dp[i-1][j];}else{//能放入dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-volumeArr[i]]+valuesArr[i]);}}}return dp[volumeArr.length-1][bagSize];}
}

2.一维dp数组(一维动态滚动数组)解决0-1背包问题——存储压缩 

dp[j]表示背包大小为j时,任意取放物品能获得的最大价值。

递推公式:dp[j]=Math.max(dp[j],dp[j-volumeArr[i]]+valuesArr[i])

注意:前面的值会影响后面值的操作,所以在遍历背包大小时,从后往前操作,防止重复操作同一行数据,导致物品重复加入。

import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc=new Scanner(System.in);int m,n=0;m=sc.nextInt();n=sc.nextInt();int[] volumeArr=new int[m];int[] valuesArr=new int[m];for(int i=0;i<m;i++) volumeArr[i]=sc.nextInt();for(int i=0;i<m;i++) valuesArr[i]=sc.nextInt();Main obj=new Main();System.out.println(obj.sloveBagProblem(n,volumeArr,valuesArr));}public int sloveBagProblem(int bagSize,int[] volumeArr,int[] valuesArr){//定义dp数组int dp[]=new int[bagSize+1];//初始化Arrays.fill(dp,0);//遍历:双for循环for(int i=0;i<volumeArr.length;i++){for(int j=bagSize;j>=0;j--){//判断是否能否加入if(volumeArr[i]<=j){//能放入dp[j]=Math.max(dp[j],dp[j-volumeArr[i]]+valuesArr[i]);}}}return dp[bagSize];}
}

 

3.分析

时间复杂度

        O(m*n)

空间复杂度

        二维:O(m*n)

        一维:O(n)

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

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

相关文章

2024 Midjourney 基础教程(⼆):了解 Midjourney Bot 和AI绘画使用技巧进阶教学

在上⼀篇⽂章中&#xff0c;我们学到了如何注册 Midjourney &#xff0c;开通付费订阅&#xff0c;并画出了可能是⾃⼰的第⼀张 AI绘画。怎么样&#xff1f;这种将想象的画⾯&#xff0c;变为现实世界图⽚的感觉。 是否有种造物者的错觉&#xff0c;同时有种开盲盒的惊喜感&…

行为型设计模式——模板方法模式

学习难度&#xff1a;⭐ &#xff0c;比较常用 模板方法模式 在面向对象程序设计过程中&#xff0c;程序员常常会遇到这种情况&#xff1a;设计一个系统时知道了算法所需的关键步骤&#xff0c;而且确定了这些步骤的执行顺序&#xff0c;但某些步骤的具体实现还未知&#xff0…

Linux系统——测试端口连通性方法

目录 一、TCP端口连通性测试 1、ssh 2、telnet&#xff08;可能需要安装&#xff09; 3、curl 4、tcping&#xff08;需要安装&#xff09; 5、nc&#xff08;需要安装&#xff09; 6、nmap&#xff08;需要安装&#xff09; 二、UDP端口连通性测试 1、nc&#xff08;…

Mysql判断一个表中的数据是否在另一个表存在

方式一&#xff1a; 判断A表中有多少条数据在B表中【存在】,并且显示这些数据–EXISTS语句 select A.ID, A.NAME from 表A where EXISTS(select * from 表B where A.IDB.ID) 判断A表中有多少条数据在B表中【不存在】&#xff0c;并且显示这些数据–NOT EXISTS语句 select …

商品源数据如何采集,您知道吗?

如今&#xff0c;电子商务已经渗透到了人们生活的方方面面。2020年新冠肺炎突如其来&#xff0c;打乱了人们正常的生产生活秩序&#xff0c;给经济发展带来了极大的影响。抗击疫情过程中&#xff0c;为避免人员接触和聚集&#xff0c;以“无接触配送”为营销卖点的电子商务迅速…

解决录制的 mp4 视频文件在 windows 无法播放的问题

解决录制的 mp4 视频文件在 windows 无法播放的问题 kazam 默认录制保存下来的 mp4 视频文件在 windows 中是无法直接使用的&#xff0c;这是由于视频编码方式的问题。解决办法&#xff1a; 首先安装 ffmeg 编码工具&#xff1a; sudo apt-get install ffmpeg 然后改变视频的…

告诉大家上手实操skywalking的最便捷途径(无需自己构建环境)

大家可能对于skywalking都不陌生&#xff0c;它是一个APM&#xff08;application performance monitor&#xff09;产品&#xff0c;适用于分布式系统的应用程序性能监控工具&#xff0c;专为微服务、云原生和基于容器的&#xff08;Kubernetes&#xff09;架构而设计。很多同…

Goby高级食用指南

Goby高级食用指南 1.Goby POC2.自定义字典3.Goby插件生态 - 一些好用的插件分享FOFASubDomainsBruteExportCsvAWVSRedis-cliGoby4waf初级篇参考 - Goby基本使用 1.Goby POC Goby的漏洞模块包含官方自定义的一些初始POC: 红队版的POC会实时更新,普通版则不会 Goby的POC编写…

一氧化碳中毒悲剧频发:探究道合顺电化学传感器促进家庭取暖安全

1月6日&#xff0c;陕西省榆林市发生了一起疑似因使用煤炭炉取暖中毒事件。通报称&#xff0c;经公安部门现场调查&#xff0c;并结合医院救治情况&#xff0c;初步判断5人属一氧化碳中毒&#xff0c;其中4人抢救无效死亡&#xff0c;令人痛心。 一般来说&#xff0c;这种在日…

掌握设计模式:深入了解命令模式的优雅调度与行为解耦

命令模式是一种行为设计模式&#xff0c;其目的是将请求发送者和接收者解耦&#xff0c;从而允许发送者发送请求&#xff0c;而无需知道请求的具体处理方式。在命令模式中&#xff0c;请求被封装为一个对象&#xff0c;这个对象包含了执行请求所需的所有信息&#xff0c;包括调…

005集 内置模块math、datetime等应用实例—python基础入门实例

在真正做项目时&#xff0c;我们会使用别人已经开发好的模块&#xff0c;这样就不必 从零开发项目了&#xff0c;还可以加快开发速度。这些模块可能是Python官方提 供的&#xff0c;也可能是第三方开发的。Python官方提供的模块&#xff0c;就叫作“内置 模块”。 math模块相关…

深度学习分类任务中的准确率、精确率(查准率)、召回率(查全率)、F1值、ROC曲线的AUC值,

0. 混淆矩阵 其中关于 TP, TN; FP, FN 的解释&#xff1b; 其中 首字母 T&#xff0c;F代表预测的情况&#xff0c;即T代表预测的结果是对的&#xff0c; F代表预测的结果是错误的&#xff1b; 第二个字母代表预测是预测为 正样本&#xff0c;还是负样本&#xff0c; Positve…