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.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
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]+" ");
}
System.out.println();
}
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--;
}
}
}
来源:CSDN
作者:茶花女-
链接:https://blog.csdn.net/qq_42764468/article/details/103901717