背包(多标准)

时间:2012-08-16 15:28:35

标签: dynamic knapsack-problem

如果我有一个背包,其中重量w 两个值v1和v2 且容量为m。如何找到重量不超过容量m的v1和v2的总值?

1 个答案:

答案 0 :(得分:0)

好的,所以你的问题定义如下。首先是一些(带有样本值的变量定义):

int N = 4; // number of items to choose from
int m = 6; // maximum weight in knapsack

// weight for an item[i] to be summed up, upper limited = m
int weight[N] = {5,2,4,3}; 

// two values for each items:
int values[2][N] = {
  {1,3,5,2},
  {6,3,2,4}
};

背包应填充物品,背包中所有物品的重量总和不超过重量“m”。每个项目有2个值的位置。我们可以将此问题视为:

我想和女朋友乘飞机去度假。我们有一个套房(=背包)和N个项目可供选择。每个项目都有一个重量,重量的总和可能不是太高(例如,重量限制空气线是25公斤,而且suirecase是1公斤,所以我们有m = 24公斤作为物品的限制)。对于每个项目,我们有2个值。值[1] [N]是我的值(在我们的巡演中背包中有项目n)。值[2] [N]是我女朋友的值,具有不同的偏好。我们还假设,每个项目只能放入背包一次,并且背包的总价值是他们的价值加上他们的价值总和的总和。

只需将值列表相加即可轻松将此问题转换为标准背包问题。因此,项目获得总体价值(例如,对于我和她在一起),我们只有一个项目的值:

int value[N] = {(1+6),(3+3),(5+2),(2+4)};

或者只是:

int value[N] = {7, 6, 7, 5};

现在每个项目只有一个值。这是正常的背包问题。

维基百科上描述了如何最佳地解决通常的背包问题。看看http://en.wikipedia.org/wiki/Knapsack_problem - 如果英语不是你的母语,也可以看看你的语言版本(从那里的菜单中选择语言)。

如果您需要进一步的帮助,请询问。