Knapsack Problem|背包问题

本文介绍了背包问题的两种类型:0-1背包问题和部分背包问题。0-1背包问题不允许物品分割,适合用动态规划解决;部分背包问题允许物品分割,可用贪婪算法处理。通过对物品价值和重量的分析,分别阐述了两种问题的解决方案及算法实现,包括动态规划和基于单位价值的贪婪方法。

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

Knapsack Problem分为两种情况:

1. 0-1 Knapsack Problem, 既0-1背包问题。

2. Fractional Knapsack Problem, 既部分背包问题。

下面将分析这两种问题以便加深对此的理解。 


问题描述:一个人准备用一个最多能装W重量物品的包来装东西。东西总计有n个,其中第i个物品的重量是W[i],价值是V[i],问这个人最多能带价值多少的东西?

1. 0-1背包问题:在此类背包问题中,此人不能将物品分割为更小的部分。所以对于物品i,此人只能决定带走或者不带走(二元选择),而不能选择带走一部分。

2. 部分背包问题:在此类背包问题中,此人可以带走某物品的一部分,也就是说,物品可以被分割成更小的部分,而此人可以决定带走物品i的xi部分,0≤xi≤1。、

我们可以把0-1背包问题想象为一个人要带走一些贵金属块。而部分背包问题想象为一个人要带走一些贵金属沙。


对于0-1背包问题:

1.不存在贪婪选择性质(greedy choice property),因此不存在贪婪算法。

2.存在最优子结构(optimal substructure property)

3.存在相互重叠的子问题(overlapping subproblem)

所以0-1背包问题可以用动态规划的方法解决(Dynamic programming)。


对于部分背包问题:

1.存在贪婪选择性质

2.存在最优子结构

因此存在贪婪算法(Greedy algorrithm)

用v[1...n]和w[1...n]分别表示n件物品的价值和重量,W表示背包可以装的物品的总重量


I.首先看0-1背包问题

设S为背包可装重量为W时的最优解,i为这个最优解中的最大物品编号。那么S'=S-{i}是背包可装重量为W-w[i]时的最优解,最优解S对应的物品价值为v[i]加上子问题S'对应的物品总价值。

同时考虑到对于任意一件物品i,有两种可能性。(1):i被包含在问题的最优解中 (2):i没有被包含在最优解中。因此n件物品,W重量对应的最大价值是以下两种情况中较大的那个:

(1) n-1件物品,W重量对应的价值的最大值。(也就是说第n件物品没有被包含在最优解中)

(2) n-1件物品,W-w[n]重量对应的价值的最大值+v[n]。(也就是说第n件物品被包含在最优解中,需要解决的问题就变成了其子问题)

如果w[n]>W,则第n件物品

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

耀凯考前突击大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值