例:有三个物品,价值分别为1500,3000,2000。重量分别为1,4,3。现有一背包容量为4
(X,Y)X 表示可以选前X件物品,Y表示还剩荣量
开始(3,4)
1.选第三件物品:2000+(2,1)
1.1选第二件物品:容量不够 2000+(1,1)
1.1.1选第一件物品:2000+1500
1.1.1不选第一件物品:2000
1.1不选第二件物品:2000+(1,1)
2.不选第三件物品:(2,4) .... 类似操作1
我们需要算出当背包容量为0,1,2,3,4。可选物品为0,1,2,3时的情况
代码如下:
public static void main(String[] args) {
System.out.println("0-1背包");
// TODO Auto-generated method stub
int[] value= {1500,3500,2000};//物品价值
int[] weight= {1,4,3};//物品重量
int max=4;//背包容量
int[][] array=new int[value.length+1][max+1];//行为物品,列为背包容量
for(int i=0;i<value.length+1;i++) {
for (int j = 0; j < max+1; j++) {
if(i==0||j==0) {
array[i][j]=0;//没有物品或没有背包容量
}else if(j>=weight[i-1]) {//背包容量大于物品容量
if (value[i-1]+array[i-1][j-weight[i-1]]>array[i-1][j]) {
//比较加入这个物品的价值加上还剩容量最大的价值是否大于不加这个物品的价值
array[i][j]=value[i-1]+array[i-1][j-weight[i-1]];
}
else {
array[i][j]=array[i-1][j];
}
}else {
array[i][j]=array[i-1][j];
}
}
}
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[0].length; j++) {
System.out.print(array[i][j]+"\t ");
}
System.out.println();
}
}