【发布时间】:2013-11-27 23:47:25
【问题描述】:
我找到了thread,它为带有 2 个背包的背包算法提供了伪代码。 我已经尝试在 C++ 中实现它,但它不像假设的那样工作。代码如下:
#include <cstdio>
#define MAX_W1 501
#define MAX_W2 501
int maximum(int a, int b, int c) {
int max = a>b?a:b;
return c>max?c:max;
}
int knapsack[MAX_W1][MAX_W2] = {0};
int main() {
int n, s1, s2, gain, weight; // items, sack1, sack2, gain, cost
scanf("%d %d %d", &n, &s1, &s2);
// filing knapsack
for (int i = 0; i < n; i++) {
scanf("%d %d", &gain, &weight);
for (int w1 = s1; w1 >= weight; w1--) {
for (int w2 = s2; w2 >= weight; w2--) {
knapsack[w1][w2] = maximum(
knapsack[w1][w2], // we have best option
knapsack[w1 - weight][w2] + gain, // put into sack one
knapsack[w1][w2 - weight] + gain // put into sack two
);
}
}
}
int result = 0;
// searching for result
for (int i = 0; i <= s1; i++) {
for (int j = 0; j <= s2; j++) {
if (knapsack[i][j] > result) {
result = knapsack[i][j];
}
}
}
printf("%d\n", result);
return 0;
}
例如以下输入:
5 4 3
6 2
3 2
4 1
2 1
1 1
我有输出:
13
显然这是错误的,因为我可以将所有物品(1,2 放入第一个袋子,其余放入第二个袋子),总和为 16。 如果我得到伪代码错误的任何解释,我将不胜感激。
我几乎没有更新,因为有些人在理解输入格式方面有问题:
- 第一行包含 3 个数字,分别是物品数量、一袋容量、二袋容量
- 后来有 n 行,每行包含 2 个数字:增益,第 i 个项目的成本。
- 假设麻袋不能大于 500。
【问题讨论】:
标签: c++ algorithm knapsack-problem