package dataStruct.常用算法;
import java.util.ArrayList;
import java.util.Hashtable;
public class 动态规划求解01背包问题 {
public static void main(String[] args) {
//定义重量的数组
int[] w = {1, 4, 3};
//定义物品的价值
int[] val = {1500, 3000, 2000};
//定义不同重量的最大价值
int n = 5;//定义背包的容量
int[][] v = new int[w.length + 1][n + 1];
int[][] path = new int[w.length + 1][n + 1];
//对不同v[][]进行赋值
for (int i = 1; i < v.length; i++) {
for (int j = 1; j < v[0].length; j++) {
//如果当前背包的容量小于第i个商品的重量,将上一行的值,复制到当前行
if (j < w[i-1]) {
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[1].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.printf("第%d个商品放到背包中\n",i);
j -= w[i-1];//减掉当前商品的重量,为剩余重量
}
i--;
}
04-19
2378
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
11-19
533
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
03-29
631
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
10-26
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交