public static void main(String[] args) {
//物品质量
int[] w = {1, 4, 3};
//物品价值
int[] value = {1500, 3000, 2000};
//背包容量
int m = 4;
//物品个数
int n = w.length;
//创建二维数组类似一张表,使用填表法完成动态规划
int[][] v = new int[n + 1][m + 1];
int[][] path = new int[n + 1][m + 1];
//将二维数组的第一行第一列置为0
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 (j < w[i - 1]) {
v[i][j] = v[i - 1][j];
} else {
//如果背包的容量大于当前物品的质量,将当前物品放入背包后考虑剩余空间是否还可以存储一个物品
//v[i][j] = Math.max(v[i - 1][j], value[i - 1] + v[i - 1][j - w[i - 1]]);
if (value[i - 1] + v[i - 1][j - w[i - 1]] > v[i - 1][j]) {
v[i][j] = value[i - 1] + v[i - 1][j - w[i - 1]];
//如果还能存储一个物品,将当前位置置为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[i].length; j++) {
System.out.print(v[i][j] + "\t");
}
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.printf("第%d个商品放入背包\n", i);
//减去当前物品的重量
j -= w[i - 1];
}
i--;
}
}
原文:https://www.cnblogs.com/mx-info/p/14883240.html