- 算法说明
蛮力法求解背包问题,求解出只放[1…n]件物品时的最大价值,对于每种放不同个数的物品,用排列组合来确定放那几个物品,总之构造向量解。
- 源代码
#include <cstdio>
#include <algorithm>
using namespace std;
#define n 4
#define max(a, b) (a) > (b) ? (a) : (b)
struct it {
int w, v;
};
it goods[n + 1];
int main() {
freopen("knapsack.txt", "r", stdin);
int W;
scanf("%d", &W);
for(int i = 0; i < n; i++) {
scanf("%d%d", &goods[i].w, &goods[i].v);
}
int a[n][n] = {
{0, 0, 0, 1},
{0, 0, 1, 1},
{0, 1, 1, 1},
{1, 1, 1, 1}
};
int maxv = -1;
for(int i = 0; i < n; i++) {
do {
int weight = 0, value = 0;
for(int j = 0; j < n; j++) {
if(a[i][j] == 1) {
weight += goods[j].w;
value += goods[j].v;
}
}
if(weight <= W) maxv = max(maxv, value);
} while(next_permutation(a[i], a[i] + n));
}
printf("%d", maxv);
return 0;
}
- 运行结果