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个商品放入到背包中\n", i);
j = j - w[i - 1];
}
i--;
}
}
}