0

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

4

1 回答 1

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公斤,行李箱是1公斤,所以我们有m=24公斤作为物品的限制)。对于每个项目,我们有 2 个值。values[1][N] 是我的值(用于在我们的旅行中将项目 n 放入背包中)。values[2][N] 是我女朋友的值,她有不同的喜好。我们还假设,每件物品只能放入背包一次,背包的总价值是它们对我的价值之和加上它们对她的价值之和。

只需将值列表相加,这个问题就可以很容易地转换为标准背包问题。所以一个项目获得一个整体价值(例如,我和她一起),我们只有一个项目的一个价值:

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

要不就:

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

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

Wikipedia 上描述了如何以最佳方式解决常见的背包问题。查看http://en.wikipedia.org/wiki/Knapsack_problem -- 如果英语不是您的母语,也请查看您的语言版本(从那里的菜单中选择语言)。

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

于 2012-08-20T21:38:15.373 回答