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