动态规划之01背包问题

package com.baozi.dynamicproblem;

/**
 * 01背包问题--动态规划思想解决
 *
 * @author BaoZi
 * @create 2019-07-06-10:51
 */
public class KnapsackProblem {
    public static void main(String[] args) {
        int[] w = {1, 4, 3};//表示物品的重量
        int[] val = {1500, 3000, 2000};//表示物品的价值
        int m = 4;//表示背包的最大容量
        int n = val.length;//表示物品的种类数量
        //创建二维数组,v[i][j]表示在前i个物品中能够装入到容量为j的背包中的物品的最大价值
        int[][] v = new int[n + 1][m + 1];
        //为了记录放入的商品的情况,我们定义一个二维数组
        int[][] path = new int[n + 1][m + 1];

        //首先初始化第一行和第一列
        for (int i = 0; i < v[0].length; i++) {
            v[0][i] = 0;
        }
        for (int i = 0; i < v.length; i++) {
            v[i][0] = 0;
        }
        //根据前面的公式进行动态规划算法的实现
        for (int i = 1; i < v.length; i++) {//这里是跳过第一行不做处理
            for (int j = 1; j < v[0].length; j++) {//这里是跳过第一列不做处理
                if (w[i - 1] > j) {
                    v[i][j] = v[i - 1][j];
                } else {
                    if (v[i - 1][j] < val[i - 1] + v[i - 1][j - w[i - 1]]) {
                        v[i][j] = val[i - 1] + v[i - 1][j - w[i - 1]];
                        path[i][j] = 1;
                    } else {
                        v[i][j] = v[i - 1][j];
                    }
                }
            }
        }
        for (int i = 0; i < v.length; i++) {
            for (int j = 0; j < v[0].length; j++) {
                System.out.print(v[i][j] + " ");
            }
            System.out.println();
        }
        //行的最大下标
        int i = path.length - 1;
        //列的最大下标
        int j = path[0].length - 1;
        while (i > 0 && j > 0) {//这里是从path 的最后一个元素开始查找
            if (path[i][j] == 1) {
                System.out.printf("第%d个商品放入到背包中
", i);
                j = j - w[i - 1];
            }
            i--;
        }
    }
}
原文地址:https://www.cnblogs.com/BaoZiY/p/11146558.html