Files
suanfa/public/c/ch3/bag01/bag01.c
T
2026-06-15 09:00:38 +08:00

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;
}