1.问题与描述:
有n种物品,第i种物品的重量为wi;价值为vi,i=1,2,3,…n.给定一个背包,最多能装重为c的物品
2.分析
例如,对于问题W={2,3,4,5},v={3,4,5,7},C=9
i\j | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
2 | 0 | 0 | 3 | 4 | 4 | 7 | 7 | 7 | 7 | 7 |
3 | 0 | 0 | 3 | 4 | 5 | 7 | 8 | 9 | 9 | 12 |
4 | 0 | 0 | 3 | 4 | 5 | 7 | 8 | 10 | 11 | 12 |
3.代码
output:package competition; public class Knapsack_0_1 { public static void main(String[] args) { int w[]= {2,3,4,5},v[]= {3,4,5,7}; int m[][]=Knapsack(w,v,9); int x[]=bulidsolution(m,w,9); for(int[]i:m){ for(int j:i){ System.out.print(j+" "); } System.out.println(); } System.out.println(); for (int i=0;i<x.length;i++) { System.out.print(x[i]+" "); } } private static int[][] Knapsack(int[] w, int[] v, int c) { int n=w.length; int[][] m=new int[n+1][c+1]; for (int i = 1; i <n+1; i++) { m[i][0]=0; } for (int j = 0; j <c+1; j++) { m[0][j]=0; } for(int i=1;i<=n;i++) for(int j=1;j<=c;j++) { m[i][j]=m[i-1][j]; if(w[i-1]<=j) { if(v[i-1]+m[i-1][j-w[i-1]]>m[i-1][j]) { m[i][j]=v[i-1]+m[i-1][j-w[i-1]]; } } } return m; } private static int[] bulidsolution(int[][] m, int[] w, int c) { int j=c,n=w.length; int[] x=new int[n]; for (int i = n; i>=1; i--) { if(m[i][j]==m[i-1][j]) { x[i-1]=0; }else { x[i-1]=1; j=j-w[i-1]; } } return x; } }
0 0 0 0 0 0 0 0 0 0
0 0 3 3 3 3 3 3 3 3
0 0 3 4 4 7 7 7 7 7
0 0 3 4 5 7 8 9 9 12
0 0 3 4 5 7 8 10 11 12
1 1 1 0