+-背包问题


9

给定一组项目,每个项目都有一个权重和一个值,请确定要包含在集合中的每个项目的数量,以使总重量小于或等于给定的限制,并且总值尽可能大。

维基百科获取更多信息

例如,您可以得到最大权重为15的对象,值/质量为的对象,[5,2], [7,4] [1,1]然后输出[7,0,1]7个[5 <value>, 2 <mass>]对象和1个[1 <value>, 1 <mass>]对象,得分为36。

规则

输入可以采用任何合理的格式

输出也是灵活的格式,

您不得使用非标准的库。如果必须安装下载任何库使用它从初始设置则分离容许

物体可能具有负质量和负值(即-1,-1)

需要最佳答案

获奖

最短的代码胜出

负数和价值?

这是这一挑战的关键部分。假设您有一个对象(物品,质量,值),例如[4,3],[-1,-1]一个容量为15的袋子。您可以放置​​第一个对象中的3个,得分为9,或者放置第一个对象中的4个和-1,-1中的一个对象得分为11。



我们可以假设没有物体具有非正质量吗?
HyperNeutrino

@HyperNeutrino一秒钟删除以进行编辑
Christopher

2
我们可以假设一切都是整数吗?另外,我们是否必须处理诸如[[2,1],[-1,-1]]这样总值可以任意增大的情况?

5
标题具有误导性。由于负权重,这不是背包问题,而是线性规划问题的一种变体。
ngn

Answers:


2

Pyth,18个字节

h.MshMZfghQseMTy*F

输出为[值,权重]对的列表。效率极低,但是它 NP完全的。
在这里尝试

说明

h.MshMZfghQseMTy*F
               y*FQ  Get all sets with up to <capacity> of each item.
       fghQseMT      Choose the sets whose total weight fits in the bag.
 .MshMZ              Choose those with the highest value.
h                    Take the first.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.