是否存在可以通过成本和大小限制获得最高价值的算法?

时间:2014-02-20 15:56:50

标签: performance algorithm knapsack-problem

我有一系列卡片。每张卡都有成本和价值。值越高,卡越好。

我想从该系列中获得最多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是每张卡的重量

2 个答案:

答案 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); 然后你得到了答案。