我有个问题:
有多个背包
有一组固定的项目,SuperSet你可以说
每个背包都有物品
一件物品只能放在一个背包里,不能重复使用
每件物品对于不同的背包都有不同的价值
每件物品的重量相同,但价值因背包而异
现在我需要分配物品的方式,我的最后一笔背包是最高的。
一些附加细节:
我是一个程序员,不是一个算法作者,所以请原谅我不知道一些细节
语言:任意(首选C#)
我只需要一个特定的算法来解决我的问题,我自己写代码
目前另一种方法是specific subset,但我正在搜索
我会提供悬赏一旦堆栈溢出允许我太正确的答案,即使它之前!在一个非常关键的时刻。

最佳答案

这是具有特定松弛度的maximum generalized assignment problem(每个项目的重量相同,但根据bin值不同)。
这种放松是很重要的:因为每件物品的重量是相同的,但是价值根据背包的不同而不同,你可以通过根据物品的重量划分每个背包的容量,将所有的重量标准化为“1”。
现在它变成了多子集和问题,有一点不同:每个背包的容量是不同的。
在“A PTAS for the Multiple Subset Sum Problem with different knapsack capacities”(Coprar,Keleer-PFSHIY)1999中研究了该问题,给出了一个多项式时间(1ε)近似算法。另一个近似方案在“Approximating the 0–1 Multiple Knapsack Problem with Agent Decomposition and Market Negotiation”[SMOLILSK] 2003中给出。
1985年“ALGORITHM 632 - A Program for the 0-1 MultipleKnapsack Problem”[martello,toth]给出了一个精确的算法。Fortran(抱歉…)代码可以找到here

09-11 17:53