编辑代码

#include <stdio.h>
#include <stdbool.h>

// 计算两个数中的较大值
int max(int a, int b) {
    return (a > b) ? a : b;
}

// 背包问题的算法设计函数
int knapsack(int W, int weight[], int value[], int n) {
    int i, w;
    int K[n+1][W+1]; // 创建一个二维数组来存储动态规划表

    // 填充动态规划表
    for (i = 0; i <= n; i++) {
        for (w = 0; w <= W; w++) {
            if (i == 0 || w == 0)
                K[i][w] = 0;
            else if (weight[i-1] <= w)
                K[i][w] = max(value[i-1] + K[i-1][w-weight[i-1]], K[i-1][w]);
            else
                K[i][w] = K[i-1][w];
        }
    }
    
    // 返回最优解(最大价值)
    return K[n][W];
}

int main() {
    int n, W;
    printf("请输入物品数量:");
    scanf("%d", &n);
    int weight[n], value[n];

    printf("请依次输入每个物品的重量和价值:\n");
    for (int i = 0; i < n; i++) {
        scanf("%d %d", &weight[i], &value[i]);
    }

    printf("请输入背包的最大承载重量:");
    scanf("%d", &W);

    int maxValue = knapsack(W, weight, value, n);
    printf("最大价值为:%d\n", maxValue);
    
    return 0;
}