/*
0/1 背包问题,填表
*/
public class BagProblem {
public static void main(String[] args) {
int [] w = {1,4,3};//每个物品的重量,下标0不使用
int [] val = {1500,3000,2000};//每个物品对应的价值,下标0不使用
int m = 4;//背包的容量
int n = val.length;//物品的个数
int [][] v = new int[n + 1][m + 1];//v[i][j]表示放入前 i 个物品中背包容量为 j 所得利益的最大值
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] = 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){
if(path[i][j] == 1){
System.out.printf("第%d个物品放入背包中\n",i);
j -= w[i-1];
}
i -= 1;
}
}
}
0/1背包问题的实现
最新推荐文章于 2022-12-16 12:28:37 发布