0-1背包问题【穷举法+二维dp数组】

news2024/11/15 17:21:35

问题描述:

使用穷举法解决0/1背包问题。问题描述:给定n个重量为{w1, w2, … ,wn}、价值为{v1, v2, … ,vn}

 的物品和一个容量为C的背包,求这些物品中的一个最有价值的子集,且要能够装到背包中。

穷举法:每件物品装还是不装有两种选择,使用0-表示不装,1表示装,n件物品就有2^n种,穷举2^n种,找到符合符合weight背包容量的且为价值最大的方式。

public class Main01 {
    //穷举法
    public void pack01(int weight,int[] wt,int[] val){
        int n = wt.length;
        int count= (int) Math.pow(2,n);
        int maxVal = 0;
        //枚举32种情况,并且记录符合weight重量背包的最大价值
        for (int i = 0; i < count; i++) {
            String res = String.format("%5s",Integer.toBinaryString(i)).replace(' ','0');
            System.out.print(res+"  ");
            int sumVal = 0;
            int sumWeight=0;
            for (int j = 0; j < n; j++) {
                //为1时表示装该物品 0表示不准装
                if (res.charAt(j)=='1') {
                    sumVal += val[j];
                    sumWeight += wt[j];
                }
                if (sumWeight<=weight){
                    maxVal = Math.max(sumVal,maxVal);
                }
            }
            System.out.println("价值:"+sumVal+"重量:"+sumWeight);
        }
        //打印最大价值下对应的背包实际重量和所装物品的状态
        for (int i = 0; i<count; i++) {
            String res = String.format("%5s",Integer.toBinaryString(i)).replace(' ','0');
            int sumVal = 0;
            int sumWeight=0;
            for (int j = 0; j < n; j++) {
                if (res.charAt(j)=='1') {
                    sumVal += val[j];
                    sumWeight += wt[j];
                }
            }
            if (sumVal==maxVal&&sumWeight<=weight){
                System.out.println("当背包重量为"+weight+"时:最大价值:"+sumVal+"  总重量: "+sumWeight+"  方式:"+res);
                break;
            }
        }

    }
    public static void main(String[] args) {
        Main01 main01 = new Main01();
        int[] wt = {1, 2, 1, 12, 4};
        int[] val = {1, 2, 2, 4, 10};
        main01.pack01(15, wt, val);
    }
}

 输出结果:

 二维dp数组:

dp[i][w]数组含义:对于前i个物品,当前背包容量为w时,可装下的最大值是dp[i][w]。

dp[i-1][w-wt[i-1]]+val[i-1]:装物品i的价值

dp[i-1][w]:不装物品i的价值

因此dp[i][w]取装物品 i dp[i-1][w-wt[i-1]]+val[i-1]  和  不装物品i dp[i-1][w] 的最大值

public class Main01 {
    public static void main(String[] args) {
        int[] wt = {1, 2, 1, 12, 4};
        int[] val = {1, 2, 2, 4, 10};
        int res = pack01(15,wt,val);
        System.out.println("最大价值:"+res);
    }

    public static int pack01(int weight,int[] wt,int[] val){
        int n = wt.length;
        //dp[i][w]数组含义:对于前i个物品,当前背包容量为w时,可装下的最大值是dp[i][w]
        int[][] dp = new int[n+1][weight+1];
        for (int i = 1; i <= n; i++) {
            for (int w = 1; w <= weight; w++) {
                if (wt[i-1]>w){
                    //不能装入背包
                    dp[i][w] = dp[i-1][w];
                }else {//择优装入背包
                    dp[i][w] = Math.max(dp[i-1][w-wt[i-1]]+val[i-1],dp[i-1][w]);
                }
            }
        }
        //打印dp表
        for (int i = 0; i <=n ; i++) {
            for (int j = 0; j <=weight ; j++) {
                if (j<weight){
                    System.out.print(dp[i][j]+",");
                }else {
                    System.out.print(dp[i][j]);
                }
            }
            System.out.println();
        }
        return dp[n][weight];
    }
}

输出结果:

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

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

相关文章

网络协议--TCP的未来和性能

24.1 引言 TCP已经在从1200 b/s的拨号SLIP链路到以太数据链路上运行了许多年。在80年代和90年代初期&#xff0c;以太网是运行TCP/IP最主要的数据链路方式。虽然TCP在比以太网速率高的环境&#xff08;如T2电话线、FDDI及千兆比网络&#xff09;中也能够正确运行&#xff0c;但…

项目一:员工管理系统

一&#xff1a;项目功能 该项目应该具有以下功能&#xff1a; 1.查询所有员工 2.查询指定编号的员工 3.添加员工信息 4.修改员工信息 5.删除员工信息 6.退出功能 二&#xff1a;技能的使用 1.使用JDBC访问数据库 2.分层开发&#xff1a; 前台&#xff1a;调用后台&#xff0c;…

【Qt】盒子布局、网格布局、表单布局和堆栈布局

盒子布局 QBoxLayout可以在水平方向或垂直方向上排列控件&#xff0c;分别派生了QHBoxLayout、QVBoxLayout子类。 QHBoxLayout&#xff1a;水平布局&#xff0c;在水平方向上排列控件&#xff0c;即&#xff1a;左右排列。QVBoxLayout&#xff1a;垂直布局&#xff0c;在垂直…

测试环境内存溢出排查过程

基本信息 客户名称&#xff1a;xxx 产品名称&#xff1a; 版本号&#xff1a; 问题分类&#xff1a;编码问题 环境类型&#xff1a;实体机 问题现象 保险公司测试环境爆内存&#xff0c;机器挂掉。总共64g的内存&#xff0c;在没有开始测试tomcat部署war包前内存使用率为25%左…

钉钉超过90天的文件需要一分钟重新激活的实现原理是什么?

具体实现原理可能包括以下几点&#xff1a; 冷热数据分类&#xff1a;系统会根据文件的访问频率将文件分为热数据和冷数据两类。热数据是经常被访问的文件&#xff0c;这些文件会被存储在快速的存储设备上&#xff0c;以便快速访问。冷数据是很少被访问的文件&#xff0c;这些…

基于ROS发布里程计信息

参考文档&#xff1a; navigationTutorialsRobotSetupOdom 参考博客&#xff1a; &#xff08;1&#xff09;ROS机器人里程计模型 &#xff08;2&#xff09;ROS里程计消息nav_msgs/Odometry的可视化方法 1 常用坐标系系统模型 世界坐标系是描述机器人全局信息的坐标系&#…

洛谷 B2004 对齐输出 C++代码

目录 推荐专栏 题目描述 AC Code 切记 推荐专栏 http://t.csdnimg.cn/Z1tCAhttp://t.csdnimg.cn/Z1tCA 题目描述 题目网址&#xff1a;对齐输出 - 洛谷 AC Code #include<bits/stdc.h> using namespace std; typedef long long ll; int main() { int a,b,c;cin&g…

【仙逆】尸阴宗始祖现身,王林修得黄泉生窍诀,阿呆惊险逃生

【侵权联系删除】【文/郑尔巴金】 深度爆料最新集&#xff0c;王林终于成功筑基&#xff0c;这一集的《仙逆》动漫真是让人热血沸腾啊&#xff01;在这个阶段&#xff0c;王林展现出了他的决心和毅力&#xff0c;成功地击杀了藤厉&#xff0c;并采取了夺基大法&#xff0c;从藤…

Hive On Spark 概述、安装配置、计算引擎更换、应用、异常解决

文章目录 Hadoop 安装Hive 安装Hive On Spark 与 Spark On Hive 区别Hive On SparkSpark On Hive 部署 Hive On Spark查询 Hive 对应的 Spark 版本号下载 Spark解压 Spark配置环境变量指定 Hadoop 路径在 Hive 配置 Spark 参数上传 Jar 包并更换引擎 测试 Hive On Spark解决依赖…

Springboot的Container Images,docker加springboot

Spring Boot应用程序可以使用Dockerfiles容器化&#xff0c;或者使用Cloud Native Buildpacks来创建优化的docker兼容的容器映像&#xff0c;您可以在任何地方运行。 1. Efficient Container Images 很容易将Spring Boot fat jar打包为docker映像。然而&#xff0c;像在docke…

智能分析视频平台EasyCVR地图功能出现异常该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

41基于matlab的CNN的图像边缘提取,程序已调通,可直接运行。

基于matlab的CNN的图像边缘提取&#xff0c;程序已调通&#xff0c;可直接运行。 41matlabCNN图像边缘提取 (xiaohongshu.com)

《AI时代架构师修炼之道:ChatGPT让架构师插上翅膀》

本专注于帮助架构师在AI时代 实现晋级、提高效率的图书 书中介绍了如何使用 ChatGPT 来完成架构设计的各个环节 并通过实战案例展示了ChatGPT在实际架构设计中的应用方法 关键点 1.架构设计新模式&#xff1a;让架构设计更高效、更快捷、更完美。 2.全流程解析&#xff1a;涵盖…

List的add(int index,E element)陷阱,不得不防

项目场景&#xff1a; 项目中有两个List列表&#xff0c;一个是List1用来存储一个标识&#xff0c;后续会根据这个标识去重。 一个List2是用来返回对象的&#xff0c;其中对象里也有一个属性List3。现需要将重复的标识数据追加到List3 我想到的两个方案&#xff1a; 尽量不动…

设计工位卡片

因为今天接到了一个设计工位卡片的任务&#xff0c;于是在这里记录一哈&#xff0c;设计卡片所需要的一些东西&#xff1a; 设计卡片的网站有以下几个可供参考&#xff1a; Canva&#xff1a;提供各种类型的卡片设计模板&#xff0c;包括圣诞贺卡、生日贺卡、感谢卡等&#x…

CL_MVSNet复现可能会出现的问题汇总

1.最好按照说明文档要求配好python3.7和pytorch1.0 2. 【已解决】 FutureWarning: The module torch.distributed.launch is deprecated and will be removed in future. torch.distributed.launch被弃用&#xff0c;考虑使用torchrun模块进行替换。 解决方案&#xff1a; 将…

pyzed.sl 突然 ImportError: DLL load failed while importing sl: 找不到指定的程序。 的解决

问题描述 >>> import pyzed.sl Traceback (most recent call last):File "<stdin>", line 1, in <module> ImportError: DLL load failed while importing sl: 找不到指定的程序。解决 1 按网上说的&#xff0c;将bin文件夹下所有dll复制到py…

2023年美团外卖商家数据(含销量)

2023年美团外卖商家、地址、电话、经纬度、起送价、月销量、评分、经营许可

前端移动web高级详细解析三

模拟移动设备&#xff0c;方便查看页面效果 屏幕分辨率 分类&#xff1a; 物理分辨率&#xff1a;硬件分辨率&#xff08;出厂设置&#xff09; 逻辑分辨率&#xff1a;软件 / 驱动设置 结论&#xff1a;制作网页参考 逻辑分辨率 视口 作用&#xff1a;显示 HTML 网页的区…