背包问题(3种的小总结)

本文总结了背包问题的三种类型:完全背包、01背包和多重背包。每种类型的背包问题都有其特定的定义和解题策略。通过实例和代码展示了如何解决这些问题,并提供了相应的输入输出格式。最后强调了解题过程中应注意的问题,如发现规律、理清计算边界等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背包问题

我实在是太弱了,这种东西才会这么点

分类


  1. 完全背包[√]
  2. 01背包[√]
  3. 多重背包[√]
  4. 毫无人性的乱七八糟的坑人专用背包[X]

定义


首先背包有一个共同的定义:有n种物品,每件物品都有一个价值vi和一个重量wi。(具体每件物品有几件,物品之间有什么主从关系是有分别的)
我们现在有一个背包,容量为c,我们要在容量范围之内(可以不装满)尽量装下价值最大的物品。

完全背包

完全背包的物品数量没有限制,也就是说,每件物品能取无数件。

01背包

顾名思义,每件物品都只能拿一个,每一个都有选和不选(1,0)两个状态

多重背包

和完全背包有些相似,但每种物品只能取ki


解决方案

背包问题有一个共同的解题模板:f[0…n][0…c]数组,f[i][j]表示当前的背包容量为j,在前i件中所能达到的最大值。f[n][c]就是最终答案
(然而,还有一种优化方案:f[0…c]。在第j重循环中,f[i]表示当前背包容量为i时,在前j种物品中所能达到的最大值。因为f[]是从后往前计算的,所以f[i-w]是j-1种物品在容量为i-w时所能达到的最大值。所以f[i-w]+v等价于f[j-1][i-w]+v)

1. 完全背包

完全背包的物品数量没有限制,也就是说,每件物品能取无数件。

	int w, v;
	for(int i=1; i<=n; i++){
   
		cin>>v>>w;
		for(int j=w; j<=c; j++){
   /*注意这里是正序枚举!!*/
			f[j] = max(f[j], f[j-w]+v);
			//等价于
			//f[i][j] = max(f[i-1][j], f[i-1][j-w]+v);
		}
	}

2. 01背包

顾名思义,每件物品都只能拿一个,每一个都有选和不选(1,0)两个状态

int w, v;
for(int i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值