add
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user