我有一系列卡片。每张卡都有成本和价值。值越高,卡越好。
我想从该系列中获得最多9张牌。 我必须把手的总费用保持在70以下。 如何制作总价值最高的牌?
数字9和70是任意的,但适用于此样本集合(值,成本)
collection = [
[390,13],
[294,7],
[393,7],
[448,7],
[235,9],
[389,9],
[306,7],
[263,8],
[231,9],
[256,7],
[396,9],
[379,9],
[306,10],
[240,9],
[259,4],
[160,4],
[225,4],
[190,3],
[141,3],
[188,3],
[190,4],
[192,4],
[192,3],
[282,5],
[192,4],
[169,3],
[253,4],
[219,4],
[240,5]
]
用背包术语
最大化和(V [i] x [i])i从1到n
受Sum(W [i] x [i])< = 70 i从1到n
和Sum(x [i])< = 9 i从1到n
其中x [i]为0或1
V是每张卡的价值
W是每张卡的重量
答案 0 :(得分:1)
这是我的背包问题版本,增加了项目数量的约束(用python编写)。 https://github.com/slek120/AutoDeck
在正常的背包问题中,您可以设置从零开始为总成本提供最高值的集合,并递增直到达到最大成本。下一组是前一组中的更好或具有总成本的集合 - 附加项目的项目成本。由于存在商品限制,因此不必仅添加商品,而是必须替换商品。因此,使用具有总成本的集合 - 项目成本+替换项目的成本。
我还创建了一个贪婪算法,它运行得更快,但没有给出最佳答案。在这种情况下,您可以使用最具成本效益的物品填充背包,直到达到物品限制。然后将项目替换为提供最大回报的下一个最具成本效益的项目。继续,直到达到最高成本。
答案 1 :(得分:0)
只需使用动态编程。
value(x)= max(value(x-i),value(i))
value(x)表示你可以用x cost得到的最大值,你将它存储在一个数组中,我们将其命名为V,它应该是静态的。
然后明确
V[0] = 0,
并且功能价值很高。
value(x){
maxValue = 0;
for(i = 1, i < x,i++){
maxValue = max( (V[i] + V[x-i]) , maxValue);
}
V[x] = max(maxValue,pickMax(x))
}
和功能
pickMax(x)
您只需选择x中可获得的最有价值的元素。
你运行值(1),值(2).... value(x); 然后你得到了答案。