要理解的是动态规划的每次求二维数组的值都和之前的值有关系(要比较判断最优的条件)
package DynamicProgramming;
/**
* @author pdzz
* @create 2019-11-28 16:39
*/
public class KnapsackProblem {
public static void main(String[] args) {
int[] w = {1,4,3};//物品的重量
int[] val = {1500,3000,2000};//商品的价值
int m = 4;//背包的容量
int n = 3;//物品的数量
//创建二维数组
int[][] v = new int[n + 1][m + 1];
int[][] path = new int[n + 1][m + 1];
//第一列全部置零
for (int i = 0; i < v.length; i++) {
v[i][0] = 0;
}
//第一行全部置零
for (int i = 0; i < v[0].length; i++) {
v[0][i] = 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 {
//v[i][j] = Math.max(v[i - 1][j],val[i - 1] + v[i - 1][j - w[i - 1]]);
if (v[i - 1][j] > val[i - 1] + v[i - 1][j - w[i - 1]]){
v[i][j] = v[i - 1][j];
} else {
v[i][j] = val[i - 1] + v[i - 1][j - w[i - 1]];
path[i][j] = 1;
}
}
}
}
for (int i = 0; i < v.length; i++) {
for (int j = 0; j < v[i].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){
if (path[i][j] == 1){
System.out.println("第" + i + "个商品放入背包");
j -= w[i - 1];
}
i--;
}
}
}