算法与数据结构 - 0/1背包问题

0/1背包问题(回溯法、分支限界法、动态规划法、贪心法)(C++版) 此篇整理自李老师上课PPT           --- On one way by myself(1)问题描述    有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容量为W的背包。设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品不仅能够放到背包中,而且重量和为W具有最大的价值。输入:3          ... 阅读详情

0/1背包问题

一个旅行者有一个最多能装m公斤的背包,现在有n个物品,重量分别是W1,W2,... , Wn 。

每件的价值分别为V1,V2, ... , Vn 。求旅行者能装入的最大总价值及其解向量。

贪心算法

总是做出在当前看来是最好的选择。

不从整体最优上加以考虑,做出局部最优解。

贪心算法不一定能得到整体最优解,但可以得到整体最优解的近似解。

CodeDemo

<span style="font-size:14px;">import java.util.*;

public class GreedyPackage {

	public static void main(String[] args) {
		// 输入流
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入物品数量:" );
		int n = sc.nextInt();
		System.out.println("请输入物品的重量(以空格间隔):");
		int[] w = new int[n];
		for(int i=0;i<n;i++)
			w[i] = sc.nextInt();
		System.out.println("请输入物品的价值(以空格分隔)");
		int[] v = new int[n];
		for(int j=0;j<n;j++)
			v[j] = sc.nextInt();
		System.out.println("请输入背包的容量:");
		int m = sc.nextInt();
		// v/w
		double[] r = new double[n]; 
		for(int k=0;k<n;k++)
			r[k] = (double)v[k]/(double)w[k];
		// 记录 w[i] - i
		Map map = new HashMap();
		for(int i=0;i<n;i++)
			map.put(w[i], i);
		// 选择排序
		int tempInt;
		double tempDouble;
		for(int i=0;i<n-1;i++){
			for(int j=i+1;j<n;j++){
				if(r[i] < r[j]){
					tempDouble = r[i]; // 互换r[i]
					r[i] = r[j];
					r[j] = tempDouble;
					tempInt = w[i]; // 互换w[i]
					w[i] = w[j];
					w[j] = tempInt;
					tempInt = v[i]; // 互换v[i]
					v[i] = v[j];
					v[j] = tempInt;
				}
			}
		}
		// 加入背包
		int total = 0; // 总价值
		int[] x = new int[n]; // 解向量
		for(int i=0;i<n;i++){
			if(w[i] <= m){
				m = m - w[i]; // 减重量
				total += v[i]; // 加价值
				x[(int)map.get(w[i])] = 1; // 获得原始w[i]对应的i
			}
		}
		// 输出结果
		System.out.println("最大总价值为:" + total);
		System.out.print("解向量为:");
		for(int i=0;i<n;i++)
			System.out.print(x[i] + " ");
	}
	
}</span>

测试样本

n = 4

w[i] = { 5,4,6,3 }

v[i] = { 10,40,30,50 };

c = 10

输出

最大总价值为:90
解向量为:0 1 0 1 



回溯法 —— 求解0/1背包问题(剪枝) 0/1背包问题 题目描述: 有n个重量分别为w1,w2,…,wn的物品(物品编号为1~n),它们的价值分别为v1,v2,…,vn,给定一个容量为W的背包。设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么选不中,要求选中的物品不仅能够放到背包中,而且具有最大价值,并对下表所示4个物品求出W=6时的所有解和最佳解。 分析思路:回溯法 设n件物品重量分别为w1,w2,…,wn的物品,用数组w[1 … n]存放,物品的价值分别为v1,v2,…,vn,用数组v[n]存放;限制重量用W表示。用x[ 阅读详情

相关推荐

题解-混合背包

混合背包 描述 一个旅行者有一个最多能装V公斤的背包,现在有n件物品,它们的重量分别是W_1,W_2,…,W_nW 1 ​ ,W 2 ​ ,…,W n ​ ,它们的价值分别为C_1,C_2,…,C_nC 1 ​ ,C 2 ​ ,…,C n ​ 。有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包)。求解将哪些物品装入背包可使这些...

Ampty36的博客 643

动态规划法求解0/1背包问题

一、求解0/1背包问题 1、问题描述 有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容量为C的背包。 设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品的总重量不能超过背包的容量,求具有最大的价值的装载方案。 2、蛮力法求解 3、证明0/1背包问题满足最优性原理 4、问题分析 (1)第1步 问题结构分...

wmy01234的博客 1万+

深入探索数据结构:箱子装载问题的解决方案

数据结构是计算机科学与技术专业的核心课程之一,它研究如何有效地存储、组织数据,以及如何高效地操作这些数据。掌握数据结构的知识对于IT行业的从业者来说至关重要,它不仅可以提高编程技能,还能优化算法性能,解决实际工作中遇到的复杂问题。数据结构的分类广泛,包括线性结构(如链表、栈、队列)、树形结构(如二叉树、红黑树、B树)、图结构(如最短路径算法、网络流问题),以及散列结构等。每种数据结构对应着不同的应用场景和常用算法,例如排序算法、搜索算法、图的遍历算法等。

weixin_36444661的博客 749

背包问题动态规划求解

【问题描述】有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容量为W的背包。 设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品不仅能够放到背包中,而且重量和为W具有最大的价值。 int n=5,W=10; //5种物品,限制重量不超过10 int w[MAXN]={0,2,2,6,5,4}; //下标0不用 int v[MAXN]={0,6,3,5,4,6}; PS:本题不要求背包必须装满 思路: 本题用动态

weixin_48937140的博客 1461

Andriod应用开发基础项目——记账本

本项目采用Java语言编写,是一款基于Android Studio开发的简易项目,本项目可以提高Java语言编写软件的能力,同时加深对开发软件Android studio有了更深层次的掌握,很适合初学者。在项目过程中,遇到了一些挑战和问题,但通过不断的努力和学习,最终取得了成功。未来,可以还可以继续优化App的功能和性能,增加更多实用的功能,提升用户体验。

eryasd的博客 3467

Origin画图——获取论文图中数据

有时候需要已发表论文的图的数据,这里使用Origin软件取值,并且可以实现对图形再次画图。 Step 1. 打开origin软件,点击工具,图形数字化工具。 Step 2. 打开要获取数据的图片。拉动红蓝坐标,与图的坐标轴所贴合。 Step 3. 打开要获取数据的图片。拉动红蓝坐标,与图的坐标轴所贴合。 Step 3. 设置参数横轴起始坐标为300-900,纵轴为1.8-2.6. Step 4. 点击第五个手动取点,取出图中数据点。 Step 5. 依次对原图进行取点。点击项目资源查看图。

qq_42278015的博客 5183

数据结构与算法篇-0/1背包问题-制表法

给出0/1背包问题的制表法

haoly1989的博客 584

Ubuntu docker镜像中下载安装 DPABI(DPARSF)

在Ubuntu服务器的docker镜像中用MATLAB运行DPABI(以及使用DPARSF的功能)。

Pandako's Blog 1722

Java数据结构与算法(0/1背包问题)

背包问题(Knapsack Problem)是组合优化问题中的一个经典问题,有多个变种。这里我们讨论的是 0/1 背包问题,这是最基本的一种形式。问题的描述如下:给定 nnn 件物品,每件物品有一个重量 wiw_iwi​ 和一个价值 viv_ivi​,以及一个背包,它能够承载的最大重量为 WWW。我们需要确定应该将哪些物品放入背包,以使得背包内物品的总价值最大。

磐门的博客 686

从入门到精通|Yalmip+Cplex在电力系统中的应用(Matlab代码实现)

​ 火电成本包括运行成本、碳捕集成本,其中火电运行成本由运行维护成 本和发电煤耗成本构成,发电煤耗与其出力关系: ,F 为机组煤耗量(kg/h),P 为机组出力/MW;运行维护成本按照 0.5 倍煤耗成本考虑,碳捕集成本取决于碳排放量及碳捕集单价,火电机组相关参数如附表 1 所示,电煤价格为 700 元/t ​

weixin_46039719的博客 1552

FPGA实现DDR接口

verilog// DDR2控制器状态机// 初始化序列// 发出初始化命令endendendend// 自动预充电end// 其他状态...endcaseendend。

whm128的博客 998

算法设计与分析/数据结构与算法实验7:0-1背包问题(分支限界法)

给定$n$种物品和一背包。物品$i$的重量是$w_i$,其价值为$v_i$,背包的容量为$C$。问:应该如何选择装入背包的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品$i$只有两种选择,即装入背包或不装入背包。不能将物品$i$装入背包多次,也不能只装入部分的物品$i$。因此,该问题称为0-1背包问题。 此问题的形式化描述是:给定$C>0,w_i>0,v_i>0,1 \le i

zombotany的博客 7917

优快云 2

2

qq_62260432的博客 5236

Java数据结构与算法(0/1背包问题优化)

背包问题(Knapsack Problem)是组合优化问题中的一个经典问题,有多个变种。这里我们讨论的是 0/1 背包问题,这是最基本的一种形式。问题的描述如下:给定 n 件物品,每件物品有一个重量 wi 和一个价值 vi,以及一个背包,它能够承载的最大重量为 W。我们需要确定应该将哪些物品放入背包,以使得背包内物品的总价值最大。

磐门的博客 591

使用Simulink对固定翼无人机的自动起飞与降落进行仿真

本文介绍了基于Simulink的固定翼无人机自动起飞与降落控制系统设计方法。系统包含飞行器动力学模型、控制系统、环境模拟等模块,通过简化动力学方程描述无人机运动特性。详细说明了从创建模型、设置动力学方程、设计PID控制器(包括自动起飞和降落控制策略)到添加环境模拟的完整仿真流程。重点阐述了升降舵和发动机推力的控制律设计,以及性能评估要点。本方法可有效验证控制系统设计,优化飞行稳定性和安全性参数,为无人机自主控制提供仿真支持。

amy_mhd的博客 223

中兴交换机如何配置?有哪些常用的配置命令,本文值得收藏!

中兴交换机是一种常见的网络设备,用于构建和管理企业网络。它提供了丰富的功能和灵活的配置选项,使网络管理员能够根据特定需求进行定制化配置。本文将详细介绍中兴交换机的配置过程,包括登录、基本设置、VLAN配置、接口配置和安全配置等内容。

网络技术联盟站 1万+

算法设计与分析/数据结构与算法实验6:0-1背包问题(回溯法)

给定$n$种物品和一背包。物品$i$的重量是$w_i$,其价值为$v_i$,背包的容量为$C$。问:应该如何选择装入背包的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品$i$只有两种选择,即装入背包或不装入背包。不能将物品$i$装入背包多次,也不能只装入部分的物品$i$。因此,该问题称为0-1背包问题。 此问题的形式化描述是:给定$C>0,w_i>0,v_i>0,1 \le i

zombotany的博客 7319

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

数据结构与算法篇-0/1背包问题-朴素递归解

给出0/1背包问题最直观的朴素递归解法

haoly1989的博客 832

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

数据结构与算法的经典问题 — 背包问题

数据结构与算法的经典问题 — 背包问题

世界那么大,我想去看看~【随心更新,看世界去了😄】 1411

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

多重背包单调队列优化思路_令人头疼的背包九讲(1)0/1背包问题

背包问题是一个经典的动态规划模型。它既简单形象容易理解,又在某种程度上能够揭示动态规划的本质,故不少教材都把它作为动态规划部分的第一道例题.题目0/1背包问题题目要求有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。输入格式第一行两个整数,N,M空格隔开,分别表示物品数量和背包容积。接下来有N行...

weixin_30030437的博客 226

计算机面试常见题目-算法

面试问题之软件工程题 1.软件重用? 同一个函数重复用。 2.软件测试类型? 单元,集成,黑盒,白盒。 3.软件工程步骤 需求,设计,开发,测试。 4.UML 系统流程建模工具 5软件工程的认识? 运用工程化的方法管理软件开发。 ...

谅至的博客 2886

C++(数据结构与算法):59---贪婪算法(贪心算法)、贪婪算法应用(货物装载、0/1背包问题、拓扑排序、二分覆盖、单源最短路径、最小成本生成树)

一、最优化问题 本文及后面介绍的算法例子都是“最优化问题”。每个最优化问题都包含一组“限制条件”和一个“优化函数”。符合限制条件的问题求解方案称为“可行解”。使优化函数可能取得最佳值的可行解称为“最优解” 二、贪婪算法思想 在贪婪算法中,我们要逐步构造一个最优解。每一步,我们都在一定的标准下,作出一个最优决策。在每一步做出的决策,在以后的步骤中都不可更改。做出决策所依据的标准称为贪婪准则 三、...

董哥的黑板报 3356

C++(数据结构与算法):62---回溯法、回溯法应用(货箱装载、0/1背包问题、最大完备子图、旅行商问题、电路板排列)

待续

董哥的黑板报 1429

从理论到实战:C++实现优先队列式分枝限界法求解0/1背包问题

本文详细介绍了如何使用C++实现优先队列式分枝限界法求解0/1背包问题。通过分析优先队列在算法中的关键作用、设计高效的数据结构以及优化剪枝策略,帮助开发者掌握这一经典算法设计方法。文章包含完整的代码实现和性能优化技巧,适用于算法竞赛和实际工程应用。

weixin_30315435的博客 395

0/1背包问题

一、0/1背包问题算法基本思想 0/1背包问题是经典的动态规划问题。 问题基本描述为:给你体积为V的背包,在物品G1,G2,G3...(这些物品所对应的体积分别为W1,W2,W3...价值分别为P1,P2,P3...)中选择一些放到背包里,使得在不超过背包体积的情况下,背包内物品的价值总和为最大。 一句话:决定一件物品要不要放进背包的条件是这件物品放进去所带来的总体收益是大于还是小于不放

ppppppc 713

C++(数据结构与算法):63---分支定界、分支定界应用(货箱装载、0/1背包问题、最单完备子图、旅行商问题、电路板排列)

一、前言 寻找问题的解的一种可靠的方法: 是首先列出所有候选解,然后逐个,在检查完所有或部分候选解之后,即可找到所需要的解 理论上,只要候选解数量有限,并且在检查了所有或部分候选解之后可以确定所需解。 这种方法是可行的。不过在实际应用中,很少使用这种方法, 因为候选解的数量通常都非常大(比如指数级,甚至是大数阶乘),即便采用最快的计算机,也只能对实例规模相当小的问题在合理的时间内解...

董哥的黑板报 1248
上一篇: Java - JDBC
下一篇: Java - JSON
Name_Larry
博客等级 码龄11年 2粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值