01背包问题(动态规划)

【说明】

有 n 个物品,第i个物品价值为v(i),重量为w(i),其中v(i)和w(i)均为非负数,背包的容量为W,W为非负数。现需要考虑如何选择装入背包的物品,使装入背包的物品总价值最大。

物品数量 = 4 背包容量 = 5
物品编号 物品价值 物品重量
1 2 1
2 4 2
3 5 3
4 6 4

【代码实现】

#include <stdio.h>

// 物品数量 = 4     背包容量 = 5
//
// 物品编号 1   2   3   4
// 物品价值 2   4   5   6
// 物品重量 1   2   3   4

int max(int a, int b) {
    return a > b ? a : b;
}

int main() {
    int w[] = {0, 1, 2, 3, 4};
    int v[] = {0, 2, 4, 5, 6};

    int N = 4;
    int W = 5;

    int i, j;
    int f[N + 1][W + 1];

    for (int y = 0; y <= N; y++) {
        for (int x = 0; x <= W; x++) {
            f[y][x] = 0;
            printf("f[%d][%d]=%d\t", y, x, f[y][x]);
        }
        printf("\n");
    }

    printf("\n");

    for (i = 1; i <= N; i++) {
        for (j = 1; j <= W; j++) {
            if (j >= w[i]) {
                f[i][j] = max(f[i - 1][j], f[i - 1][j - w[i]] + v[i]);
                printf("f[%d][%d]=%d\t", i, j, f[i][j]);
            } else {
                f[i][j] = f[i - 1][j];
                printf("f[%d][%d]=%d\t", i, j, f[i][j]);
            }
        }
        printf("\n");
    }

    printf("\n最大价值:%d", f[N][W]);

    return 0;
}

【算法分析】

时间复杂度:O(N×W)
空间复杂度:O(N×W)
posted @ 2023-03-23 13:58  云の彼端  阅读(26)  评论(0)    收藏  举报