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--; } } }