美文网首页
动态规划:0-1背包问题

动态规划:0-1背包问题

作者: 云飞扬1 | 来源:发表于2020-12-03 15:56 被阅读0次

1. 方法一

/**
     * 动态规划 0-1背包问题
     *
     * @param weight 物品重量
     * @param w      背包能承受的总重量
     * @return
     */
    public static int knapsack(int[] weight, int w) {
        int n = weight.length;
        boolean[][] states = new boolean[n][w + 1]; // 默认值false
        states[0][0] = true;  // 第一行的数据要特殊处理,可以利用哨兵优化
        if (weight[0] <= w) {
            states[0][weight[0]] = true;
        }
        for (int i = 1; i < n; ++i) { // 动态规划状态转移
            for (int j = 0; j <= w; ++j) {// 不把第i个物品放入背包
                if (states[i - 1][j] == true) states[i][j] = true;
            }
            for (int j = 0; j <= w - weight[i]; ++j) {//把第i个物品放入背包
                if (states[i - 1][j] == true) states[i][j + weight[i]] = true;
            }
        }
        int t = 0;
        for (int i = w; i >= 0; --i) { // 输出结果
            if (states[n - 1][i] == true) {
                t = i;
                break;
            }
        }

        int tmp = t;
        java.util.Stack<Integer> stack = new Stack();
        for (int i = n - 1; i >= 0; i--) {
            if (i > 0) {
                if (states[i - 1][tmp] == false && states[i][tmp - weight[i]] == true) {
                    stack.push(i);
                    tmp -= weight[i];
                }
            } else {
                if (t > 0) {
                    stack.push(i);
                }
            }
        }

        while (!stack.isEmpty()) {
            System.out.print(stack.pop() + ",");
        }

        return t;
    }

2. 方法二(改进版本)

    public static int knapsack(int[] weight, int w) {
        int n = weight.length;
        boolean[] states = new boolean[w + 1];
        states[0] = true;
        if (weight[0] <= w) {
            states[weight[0]] = true;
        }
        for (int i = 1; i < n; i++) {
            for (int j = w - weight[i]; j >= 0; j--) {
                if (states[j] == true) {
                    states[j + weight[i]] = true;
                }
            }
        }

        int t = 0;
        for (int i = w; i >= 0; i--) {
            if (states[i] == true) {
                t = i;
                break;
            }
        }

        int tmp = t;
        Stack<Integer> stack = new Stack<>();
        for (int i = n - 1; i >= 0; i--) {
            if (tmp - weight[i] >= 0 && states[tmp - weight[i]] == true) {
                tmp -= weight[i];
                stack.push(i);
            }
        }
        while (!stack.isEmpty()) {
            System.out.print(stack.pop() + ",");
        }

        return t;
    }

3. 背包里价值最大

    public static int knapsack(int[] weight, int[] value, int w) {
        int n = weight.length;
        int[][] states = new int[n][w + 1];
        for (int i = 0; i < states.length; i++) {
            for (int j = 0; j < states[i].length; j++) {
                states[i][j] = -1;
            }
        }
        int maxValue = 0;
        states[0][0] = 0;
        if (weight[0] <= w) {
            states[0][weight[0]] = value[0];
        }
        for (int i = 1; i < n; i++) {
            //不装入背包
            for (int j = 0; j <= w; j++) {
                if (states[i - 1][j] > 0)
                    states[i][j] = states[i - 1][j];
            }
            //装入背包
            for (int j = 0; j <= w - weight[i]; j++) {
                if (states[i - 1][j] >= 0) {
                    int v = states[i - 1][j] + value[i];
                    if (v > states[i][j + weight[i]]) {
                        states[i][j + weight[i]] = v;
                    }
                }
            }
        }

        int p = 0;
        for (int i = 0; i <= w; i++) {
            if (states[n - 1][i] > maxValue) {
                maxValue = states[n - 1][i];
                p = i;
            }
        }

        Stack<Integer> stack = new Stack<>();
        for (int i = n - 1; i >= 0; i--) {
            if (i > 0) {
                if (states[i - 1][p] == states[i][p]) {

                } else {
                    stack.push(i);
                    p -= weight[i];
                }
            } else {
                if (states[i][p] > 0) {
                    stack.push(i);
                }
            }
        }

        while (!stack.isEmpty()) {
            System.out.print(stack.pop() + ",");
        }

        return maxValue;
    }

相关文章

  • 动态规划

    0-1背包问题 自己实现的0-1背包问题的动态规划解法,先贴上吧,动态规划原理解释有空再写。

  • 初识动态规划

    0-1 背包问题 备忘录 动态规划-二维数组 动态规划-一维数组 0-1 背包问题升级版 回溯算法 动态规划-二维...

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

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

  • 数据结构与算法笔记day23:动态规划

    1初识动态规划 这节课的内容不涉及动态规划的理论,而是通过两个例子:0-1背包问题、0-1背包问题升级...

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

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

  • 背包问题

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

  • 背包问题

    1、前言 背包问题是典型的动态规划问题,它有非常多的类型,本文讨论最常见的0-1背包问题 0-1背包问题描述:有一...

  • Algorithm

    bit manipulation 动态规划 0-1背包问题 寻找最小的k个数

  • 算法3:动态规划

    5.动态规划5.1 什么是动态规划?5.2 自底向上的动态规划:5.3 自顶向下的动态规划5.4 0-1背包问题:...

  • 动态规划-0-1背包问题

    动态规划-0-1背包问题 动态规划(dynamic programming)是解决多阶段决策问题常用的最优化理论,...

网友评论

      本文标题:动态规划:0-1背包问题

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