59 lines
1.6 KiB
C
59 lines
1.6 KiB
C
|
|
#include <stdio.h>
|
||
|
|
#define ITEM_COUNT 5
|
||
|
|
#define CAPACITY 6
|
||
|
|
|
||
|
|
int weights[ITEM_COUNT] = { 2, 3, 6, 5, 4 };
|
||
|
|
int values[ITEM_COUNT] = { 60, 30, 50, 40, 60 };
|
||
|
|
|
||
|
|
// 递推实现
|
||
|
|
void bag01Ditui() {
|
||
|
|
int f[CAPACITY + 1] = {0}; // 初始化数组
|
||
|
|
int taken[ITEM_COUNT][CAPACITY + 1] = {0}; // 用于记录物品放置状态
|
||
|
|
for (int i = 0; i < ITEM_COUNT; i++) {
|
||
|
|
int w = weights[i];
|
||
|
|
int v = values[i];
|
||
|
|
for (int j = CAPACITY; j >= w; j--) {
|
||
|
|
if (f[j] < f[j - w] + v) { // 如果放入当前物品后价值更高
|
||
|
|
f[j] = f[j - w] + v;
|
||
|
|
taken[i][j] = 1; // 标记当前物品被放入
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
printf("最大价值为: %d\n", f[CAPACITY]);
|
||
|
|
|
||
|
|
// 打印各物品的放置情况
|
||
|
|
printf("放入背包的物品: ");
|
||
|
|
for (int i = ITEM_COUNT - 1, j = CAPACITY; i >= 0; i--) {
|
||
|
|
if (taken[i][j]) {
|
||
|
|
printf("%d ", i + 1); // 输出物品编号 (1-based index)
|
||
|
|
j -= weights[i]; // 减去相应的重量
|
||
|
|
}
|
||
|
|
}
|
||
|
|
printf("\n");
|
||
|
|
}
|
||
|
|
|
||
|
|
// 递归实现
|
||
|
|
int bagProblem(int i, int j) {
|
||
|
|
if (i < 0) {
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
int r = 0;
|
||
|
|
// 如果剩余空间大于或等于当前物品的重量
|
||
|
|
if (j >= weights[i]) {
|
||
|
|
// 放入当前物品的价值
|
||
|
|
int r1 = bagProblem(i - 1, j - weights[i]) + values[i];
|
||
|
|
// 不放入当前物品的价值
|
||
|
|
int r2 = bagProblem(i - 1, j);
|
||
|
|
r = (r1 > r2) ? r1 : r2;
|
||
|
|
} else {
|
||
|
|
r = bagProblem(i - 1, j);
|
||
|
|
}
|
||
|
|
return r;
|
||
|
|
}
|
||
|
|
|
||
|
|
int main() {
|
||
|
|
bag01Ditui();
|
||
|
|
printf("递归方式得到的最大价值为: %d\n", bagProblem(ITEM_COUNT - 1, CAPACITY));
|
||
|
|
return 0;
|
||
|
|
}
|