0-1背包问题

2019年下半年软件设计师下午真题试题(案例分析)及答案 2019下半年软件设计师上午真题及答案解析 目录 1.二手车物流系统的数据流图 2.技能培训管理系统的关系模式 3.牙科诊所信息系统的用例图和类图 4.0-1背包问题 5.文件管理系统(Java) 1.二手车物流系统的数据流图 阅读下列说明和图,回答问题1至问题4。 【说明】某公司欲开发一款二手车物流系统,以有效提升物流成交效率。该系统的主要功能是:(1)订单管理:系统抓取线索,将车辆交易系统的交易信息抓取为线索。帮买顾问看到有买车线索后,会打电话询问买家是否需要物流,若需要,帮买顾. 阅读详情

什么是背包问题?

问题描述:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。即给定一个载重量为room的背包,另有num个物品,其每个物品重量为size_i,价值为value_i,1<=i<=n,选择物品装入背包,使得背包内的物品价值最大。

问题分析:
0-1背包问题可以看作是动态规划的一个经典案例。
在该问题中,物体只能选择装入背包或不装入背包。
我们借助一个辅助表table[num+1][room+1],table[i][j]表示前i个物品装入载重量为j的背包中的最大价值。
循环过程中,若size_i > j,表示当前物品重量超过当前背包载重量,则table[i][j]为不装入当前物品的价值,即table[i][j]=table[i-1][j];若size_i < j,表示当前物品重量小于当前背包的载重量,则table[i][j]为不装入当前物品和装入当前物品的价值的较大值,即table[i][j] = Max(table[i-1][j],table[i-1][j-size_i]+value_i)

测试:
输入背包容量:10
输入物品数量:5
输入物品重量和价值:1,1;3,2;2,4;4,5;6,2
填表结束后的辅助表如图:
这里写图片描述

下面给出背包问题的代码实现:

import java.util.Scanner;

/**
 * 0-1背包问题
 * @author zxy
 *
 */
public class Bag {

    private int room; //背包容量

    private int num; //物品数量

    private int[] size; // 物品重量表

    private int[] value; //物品价值表

    private int[][] table; //辅助表 竖轴num 横轴room 表中所填为当前背包容积的最大价值

    public Bag(int room, int num) {
        super();
        this.room=room;
        this.num = num;
        this.size=new int[num+1];
        this.value=new int[num+1];
        this.table=new int[num+1][room+1];        
    }

    /**
     * 从左上角往右下角填0-1背包辅助表
     * 表中右下角的值即为背包容量的最大价值
     * @param bag
     */
    public static void fun(Bag bag){
        for(int i=1;i<=bag.num;i++){
            for(int j=1;j<=bag.room;j++){ 
                //背包容量小于当前物品重量,
                //则当前背包容量最大价值为舍弃当前物品的价值
                if(j<bag.size[i]){
                    bag.table[i][j]=bag.table[i-1][j];
                //背包容量大于当前物品重量,
                //则当前背包容量最大价值为舍弃当前物品和放入当前物品的价值的较大值
                }else{
                    bag.table[i][j]=max(bag.table[i-1][j],bag.table[i-1][j-bag.size[i]]+bag.value[i]);
                }
            }
        }
    }

    /**
     * 获取较大值
     * @param a
     * @param b
     * @return
     */
    public static int max(int a, int b){
        return a>b?a:b;
    }

    /**
     * 打印0-1背包辅助表
     * @param bag
     */
    public static void out(Bag bag){
        for(int i=0;i<=bag.num;i++){
            for(int j=0;j<=bag.room;j++){
                System.out.print(bag.table[i][j]+" ");
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int room=scanner.nextInt();
        int num=scanner.nextInt();
        Bag bag=new Bag(room,num);
        for(int i=1;i<=num;i++){
            bag.size[i]=scanner.nextInt();
            bag.value[i]=scanner.nextInt();
        }
        fun(bag);
        out(bag);
    }

}
动态规划——0-1背包问题 一、问题描述 有n个物品,每个物品有各自的体积和价值,有一个给定容量的背包,问:在不超过背包总容量的前提下,如何装物品才能使得背包的总价值最大? 二、动态规划算法原理及其过程: 1、原理 动态规划是把大问题拆分成若干子问题,通过寻找大问题与子问题的递推关系,解决一个个子问题,最终达到解决原问题的效果。动态规划则通过填写表把所有已经解决的子问题答案记录下来,在新问题里需要用到的子问题的解可以直接... 阅读详情

相关推荐

动态规划 之 0-1背包问题

关于背包问题,其实可以分为两种类型:0-1背包问题 和 部分背包问题。 1、先通过一个例子来说明一下二者的区别吧! 有一个窃贼在偷窃一家商店时发现有n件物品,第i件物品价值为vi元,重量为wi,假设vi和wi都为整数。他希望带走的东西越值钱越好,但他的背包中之多只能装下W磅的东西,W为一整数。他应该带走哪几样东西? 0-1背包问题:每件物品或被带走,或被留下,(需要做出0-1选择)。小偷

小邓笔记 3万+

彻底理解0-1背包问题

0-1背包问题 给定n个重量为w1、w2、w3、…、wn,价值为v1、 v2​、v3​、 …、vn​的物品和容量为C的背包,求这个物品中一个最有价值的子集,使得在满足背包的容量的前提下,包内的总价值最大 0-1背包问题指的是每个物品只能使用一次 递归方法 首先我们用递归的方式来尝试解决这个问题 我们用F(n,C)表示将前n个物品放进容量为C的背包里,得到的最大的价值。 我们用自顶向下的角度...

carcarrot的博客 2435

C++ 实现 0-1 背包问题

1.什么是动态规划 首先介绍一下动态规划... 设计一个动态规划算法,通常可按照以下几个步骤进行: (1) 找出最优解的性质,并刻画其结构特征。 (2) 递归地定义最优解的值 (3) 以自底而上的方式计算出最优值 (4) 根据计算最优值时得到的信息,构造一个最优解。 对于一个给定的问题,若具有以下两个性质,则可以考虑用动态规划法来求解。

chengonghao的博客 2万+

【动态规划】01背包问题

问题描述:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。 物品编号 1 2 3 4 5 体积(weight) 48 7 40 12 8 价值(value) 6 1 5 2 1 这个题是很典型的一个动态...

开源世界 1128

蛮力法解决0/1背包问题

    使用蛮力法解决0/1背包问题,就是将所有的物品装入背包的可能全部列举出来。这个可以通过递归的方式实现。递归的过程可以看成是对一棵树的深度优先遍历:例如上图,假设从背包中的1号物品开始列举所有的可能。如果每一层仅仅简单的在循环中使用递归,则该程序就不会结束。需要使用一个一维向量用于标记当前哪些编号已经装入了。例如,当前1号物品已经装入背包,首先标记1号物品已经装入。之后,在循环中首先选择2号...

qq_36573282的博客 1万+

【Algorithm】0-1背包问题及其价值

0-1背包问题(0-1 Knapsack Problem)是一种组合优化问题,它是背包问题的一个特殊变体。在这个问题中,你给定一组物品,每个物品都有一个重量和一个价值。目标是选择一些物品放入背包中,使得背包中物品的总价值最大,同时不超过背包的最大承重限制。0-1背包问题的特点在于每个物品只能选择0个(不选)或1个(全选),不允许分割物品。给定一个物品集合,其中每个物品i都有一个重量w_i和一个价值v_i。背包有一个最大承重限制W。目标是找到一个物品的子集,使得子集中物品的总价值V。

格物致知 1107

九种 0-1 背包问题详解

目录 动态规划概念 问题1:0-1背包问题 问题2:完全背包问题 问题3:多重背包问题 问题4:混合背包问题 问题5:二维背包问题 问题6:分组背包问题 问题7:有依赖的背包问题(困难) 问题8:背包问题求方案数 问题9:背包问题求具体方案 前言 0-1 背包是一个经典的问题,之前也整理过一篇关于 0-1 背包的博客,当时只是整理了 0-1 背包问题的4 种解决方法。最近在复习算法,发现有很多 0-1 背包问题的衍生问题。0-1 背包问题的限制条件既可以是重量,也可以是容量,或者..

Tyler_Zx的博客 2万+

非整数0-1背包问题

0-1背包问题通常情况下物品的重量是整数的,采用动态规划可以解决,在解决物品重量非整数情况下的背包问题之前,我们先来回顾整数背包问题,并从中寻找解决非整数背包问题的方法。 问题定义:有n种物品和一个容量为c的背包,第i件物品的重量为wi,价格为vi,求出哪种物品组合放入背包使物品价值总和最大...

chun2674的博客 2737

0 - 1背包问题

什么是0 - 1背包 首先看一波百度词条对于 “0 - 1背包问题” 的阐述: 01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2至Wn,与之相对应的价值为P1,P2至Pn。01背包是背包问题中最简单的问题。01背包的约束条件是给定几种物品,每种物品有且只有一个,并且有权值和体积两个属性。在01背包问题中,因为每种物品只有一个,对于每个物品只需要考虑选与不选两种情况。如果不选择将其放入背包中,则不需要处理。如果选择将其放入背包中,由于不清楚之前放入的物品占据了多大的空间,需要枚举

nepu_bin的博客 3223

0-1背包问题,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。

0-1背包问题 在0 / 1背包问题中,需对容量为c 的背包进行装载。从n 个物品中选取装入背包的物品,每件物品i 的重量为wi ,价值为pi 。对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。

ANSYS HFSS 中的相控天线阵列仿真方法

相控天线阵列系统广泛使用,从国防雷达应用到商业 5G 应用。设计这些天线阵列涉及复杂的数学运算,需要全波仿真。Ansys HFSS 全场 3D 电磁仿真软件可以在合理的时间内以较低的计算成本仿真复杂的相控阵天线系统,同时考虑复杂激励、环境(即附近的天线)和平台对其性能的影响。本博客介绍了可用于有效仿真相控天线阵列的不同方法。以下是不同仿真方法的简要概述,视频链接中提供了完整的演示。ANSYS HFSS 提供 4 种不同的相控天线阵列仿真方法:1) 晶胞-无限阵列。

jkh920184196的博客 4254

0-1 背包问题

小溪汇入河流,江河汇入大海。 动态规划将小问题的解汇集成大问题的答案,一步步引领我们走向解决问题的彼岸。

yuebo_zhao的博客 1411

2.13寸电子墨水屏HINK-E0213+esp8266

很久以前买的一块电子墨水屏,运气很好,这个型号HINK-E0213资料很全,而且微雪官网也有相关电路资料等。

梦境虽美,却不长. 3004

背包问题(0-1背包问题和完全背包问题)

一. 0-1背包问题 给了一些物品的重量和价值,背包只能装下一定重量的物品,求背包能装物品的最大价值(0-1背包问题约定每个物品最多只能用一次)。 w = [5, 4, 7 ,2 ,6] #重量 p = [12,3,10, 3, 6] #价值 v = 12 #包能装下的总重量 n = 5 #物品个数 1)不超过总重量(不要求装满)的情况下,价值最大 w = [5, 4, 7 ,2 ,6...

冷咖啡离开了杯垫,来到了博客 1376

当知识图谱遇见多模态:突破文本界限的智能认知革命

本文探讨了知识图谱与多模态技术的融合,揭示了其在医疗诊断、文化保护等领域的革命性应用。通过图神经网络、对比学习框架和跨模态注意力机制等技术,实现了文本、图像和音频数据的智能关联与认知。文章还分享了在Neo4j等图数据库中的实践案例和优化策略,为构建下一代智能认知系统提供了技术参考。

weixin_29197835的博客 464

555定时器呼吸灯电路制作全攻略:从仿真到实物搭建(附避坑指南)

本文详细介绍了使用555定时器制作呼吸灯电路的完整流程,从基础原理到实物搭建,包括电路设计、元件选择、仿真验证、焊接技巧及调试优化。特别提供了避坑指南,帮助电子爱好者快速掌握这一经典DIY项目,实现美观的呼吸灯效果。

weixin_33734785的博客 402

0/1背包问题

0/1背包问题 文章目录0/1背包问题【问题描述】【问题分析】【算法设计】【算法分析】 【问题描述】 给定nnn种物品和一个背包,物品iii(1≤i≤n1 \leq i \leq n1≤i≤n)的重量是ωi\omega_iωi​,其价值是viv_ivi​,背包的容量为CCC,对于每种物品只有两种选择,即装入背包或不装入背包。问题是如何选择装入背包的物品使得装入背包的物品的总价值最大? 【问题分析】...

liuxiaocs7的博客 2611

NVMe-MI 协议解析:带外管理框架与实现原理

本文深入解析了NVMe-MI协议,这是一种用于NVMe固态硬盘的标准化带外管理接口。文章详细阐述了其独立于操作系统的管理框架,通过MCTP协议栈实现,支持SMBus/I2C、PCIe VDM和I3C等物理层,从而在系统故障时仍能可靠地进行健康监控、固件升级等关键运维操作,是现代数据中心存储管理的核心基础设施。

lll78的博客 961

0-1背包问题、完全背包问题、多维背包问题详讲及代码示例

0-1背包问题 有 N 件物品和一个容量为 V 的背包。放入第 i 件物品耗费的费用是 Ci(即占用背包的空间容量),得到的价值是 Wi。 求解将哪些物品装入背包可使价值总和最大。 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。 二维数组0-1背包问题的状态转移方程: F[i, v] = max{F[i − 1, v], F[i − 1, v − Ci] + Wi} 一维数组0-1背包问题的状态转移方程(优化后节省了空间): F[v] = max{F[v], F[v − Ci]

m0_46613023的博客 8985

渲染TA实战:冰面效果制作分享

这里画一张图:我们可以看到,如果深度图的范围没有进过缩放,那就是0-1,但是归一化的-viewDir的向量长度为1,如果-viewDir不和表面垂直(这是绝大多数的情况),那么viewDir.z的分量就是一个不定值,我们不好确定需要走多少步,viewDir才能和底面相交。然后我们需要冰面的Alpha图:因为冰是透明物体,所以相对于Albedo,我们更需要的是一张冰面裂纹的蒙版图,这张图需要记录冰面的裂纹走向和深浅、冰封的气泡、以及因为压力或气体等原因产生的类似雾的效果。

qq_41166022的博客 1027

科研级YOLOv8 Neck革新:BiFPN双向特征金字塔赋能,让多尺度融合更高效的实战指南

在文件夹下新建BiFPN.py,将上述BiFPNLayer和BiFPN类的代码写入其中。这一步是为了让YOLOv8的代码架构能识别我们的自定义Neck模块。

m0_64661770的博客 153

0-1背包问题的优化

n是物品的个数,c是物品的容量。对于0-1背包问题,它的时间优化空间已经非常小了,但是空间还有很大的优化空间。 0-1背包问题相应的状态转移方程 对于状态转移方程,它有这样的一个特点,每一次只更新一行的内容,而每一次所更新的那一行的内容,比如第i行的内容,它只依赖于第i-i行的内容,而不用去考虑i-1行之前的那些元素具体是什么样子的。换句话说,只要求出一行,就能求出下...

nicolelili1的专栏 4449

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: 排序算法
下一篇: 二叉搜索树
IceCaptain
博客等级 码龄10年 12粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值