/**
* 动态规划0-1背包算法
* @author 邹龄晋
* 答案:15 11001
*/
public class Demo {
public static void main(String[] args) {
int [] w = {2,2,6,5,4};//对应重量
int [] v = {6,3,5,4,6};//对应价值
int c = 10;//总质量
int [][] m = new int[v.length][c+1];//定义m二维数组用来表示所有的价值,m[j]表示第i物品装入容量为j的背包的最大值
int [] x = new int[w.length]; //解空间集
Knapsack(v,w,c,m);
traceback(m,w,c,x);
System.out.println("m[0][c]="+m[0][c]);
for(int i=0;i<x.length;i++){
System.out.print(x+" ");
}
System.out.println();
for(int i=0;i<v.length;i++){
for(int j=0;j<c+1;j++){
System.out.print(m[j]+"\t");
}
System.out.println();
}
}
public static void traceback(int [][]m,int []w,int c,int []x){
int n = w.length-1;
for(int i=0;i<n;i++)
if(m[c]==m[i+1][c]) x = 0;
else{
x = 1;
c-=w;
}
x[n] = (m[n][c]>0)?1:0;
}
public static void Knapsack(int v[],int w[],int c,int [][]m){
int n = v.length-1;
int jMax = Math.min(w[n]-1, c);
for(int j=0;j<=jMax;j++) m[n][j] = 0;
for(int j=w[n];j<=c;j++) m[n][j] = v[n];
for(int i=n-1;i>=0;i--){
jMax = Math.min(w-1, c);
for(int j=0;j<=jMax;j++)
m[j] = m[i+1][j];
for(int j=w;j<=c;j++)
m[j] = Math.max(m[i+1][j],m[i+1][j-w]+v);
}
}
}