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