【说明】
有 n 个物品,第i个物品价值为v(i),重量为w(i),其中v(i)和w(i)均为非负数,背包的容量为W,W为非负数。现需要考虑如何选择装入背包的物品,使装入背包的物品总价值最大。
物品数量 = 4 | 背包容量 = 5 |
---|
物品编号 | 物品价值 | 物品重量 |
---|---|---|
1 | 2 | 1 |
2 | 4 | 2 |
3 | 5 | 3 |
4 | 6 | 4 |
【代码实现】
#include <stdio.h>
// 物品数量 = 4 背包容量 = 5
//
// 物品编号 1 2 3 4
// 物品价值 2 4 5 6
// 物品重量 1 2 3 4
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
int w[] = {0, 1, 2, 3, 4};
int v[] = {0, 2, 4, 5, 6};
int N = 4;
int W = 5;
int i, j;
int f[N + 1][W + 1];
for (int y = 0; y <= N; y++) {
for (int x = 0; x <= W; x++) {
f[y][x] = 0;
printf("f[%d][%d]=%d\t", y, x, f[y][x]);
}
printf("\n");
}
printf("\n");
for (i = 1; i <= N; i++) {
for (j = 1; j <= W; j++) {
if (j >= w[i]) {
f[i][j] = max(f[i - 1][j], f[i - 1][j - w[i]] + v[i]);
printf("f[%d][%d]=%d\t", i, j, f[i][j]);
} else {
f[i][j] = f[i - 1][j];
printf("f[%d][%d]=%d\t", i, j, f[i][j]);
}
}
printf("\n");
}
printf("\n最大价值:%d", f[N][W]);
return 0;
}