美文网首页
0/1 背包

0/1 背包

作者: HalcyonMoon | 来源:发表于2016-06-29 23:16 被阅读0次

有 N 件物品和一个容量为 V 的背包。第 i 件物品的费用是 c[i],价值是 w[i]。求解将哪些物品装入背包可使价值总和最大

f[i][v]表示前 i 件物品恰放入一个容量为 v 的背包可以获得的最大价值,状态
方程:

f[i][v] = max{f[i − 1][v], f[i − 1][v − c[i]] + w[i]}

f[i][v] 依赖于 f[i-1][v]和 f[i-1][v-c[i]]

例子 1:c[] = {4,5,6},  w[]={3,4,5} v=10
0 1 2 3 4 5 6 7 8 9 10
0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 4 4 4 4 4 4 4 4
2 0 0 0 4 5 5 5 9 9 9 9
3 0 0 0 4 5 6 6 9 10 11 11
例子 2:c[] = { 6,3,5,4,6}, w[]={2,2,6,5,4}, v=10
0 1 2 3 4 5 6 7 8 9 10
1 0 0 6 6 6 6 6 6 6 6 6
2 0 0 6 6 9 9 9 9 9 9 9
3 0 0 6 6 9 9 9 9 11 11 14
4 0 0 6 6 9 9 9 10 11 13 14
5 0 0 6 6 9 9 12 12 15 15 15
public static int zeroOneKnapsack(int c[], int w[], int vol) {
    int len = c.length;
    if (len == 0 || len != w.length) {
        return 0;
    }

    int f[][] = new int[len + 1][vol + 1];
    for (int i = 1; i <= len; i++) {
        for (int v = 1; v <= vol; v++) {
            if (i == 0) {
                f[i][v] = 0;
                continue;
            }
            f[i][v] = f[i - 1][v];
            if (v >= w[i - 1]) {
                f[i][v] = Math.max(f[i][v], f[i - 1][v - w[i - 1]] + c[i - 1]);
            }
        }
    }
    return f[len][vol];
}

可以对空间做优化,用一位数组,由于 f[i][v]依赖 f[i-1][v-c[i]],需要保留上一行 v 之前的记录,所以要从右往左计算。

public static int zeroOneKnapsackII(int c[], int w[], int vol) {
    int len = c.length;
    if (len == 0 || len != w.length) {
        return 0;
    }
    int f[] = new int[vol + 1];
    for (int i = 1; i <= len; i++) {
        for (int v = vol; v >= w[i - 1]; v--) {
            f[v] = Math.max(f[v], f[v - w[i - 1]] + c[i - 1]);
        }
    }
    return f[vol];
}

相关文章

  • 0/1 背包

    有 N 件物品和一个容量为 V 的背包。第 i 件物品的费用是 c[i],价值是 w[i]。求解将哪些物品装入背包...

  • 0 1背包

    1.1 题目 有 N 件物品和一个容量为 V 的背包。放入第 i 件物品耗费的费用是 Ci ,得到的价值是 Wi ...

  • Algorithm进阶计划 -- 动态规划(下)

    经典动态规划背包问题最长子序列问题 1. 背包问题 1.1 0-1 背包问题 0-1 背包问题,描述如下: 上面...

  • 算法-动态规划-背包问题

    背包问题是基础的动态规划问题,包含了0-1背包,完全背包,多重背包等。 0-1背包 存在容量为 的背包 , 件体...

  • 背包问题

    背包问题属于典型的动态规划问题。这里我们将详细介绍0-1背包,完全背包和多重背包问题 一、 0-1背包 有N件物品...

  • lintcode-k数和

    动态规划(确定0-1背包、完全背包、多重背包)0-1背包:每个元素要么出现,要么不出现,逆序遍历,数组定义为:前i...

  • 0-1背包

    有n种物品,————每种物品只有一个————,第i种物品的体积为Vi, 重量为Wi, 选一些物品放入容量为C的背包...

  • 0/1背包问题

    输出结果

  • 0/1 背包 II

    要求要求恰装满背包在初始化时除了 f[0]为 0 其它 f[1..V]均设为-∞,这样就可以保证最终得到的f[N]...

  • 0/1背包问题 0/1 Knapsack

    题目列表 相等子集划分问题 Equal Subset Sum Partition 416. 分割等和子集 子集和问...

网友评论

      本文标题:0/1 背包

      本文链接:https://www.haomeiwen.com/subject/qaqxjttx.html