import java.util.Scanner;
public class KnapsackProblem {
public static void main(String[] args) {
KnapsackProblem knapsackProblem = new KnapsackProblem();
Scanner scanner = new Scanner(System.in);
System.out.println("请输入背包容量");
int c = scanner.nextInt();
System.out.println("请输入物品数量");
int n = scanner.nextInt();
int[] v;
int[] w;
v = new int[n+1];
w = new int[n+1];
v[0] = 0;
w[0] = 0;
System.out.println("请按顺序输入各物品的价值");
for (int q = 1; q < n+1; q++) {
System.out.println("请输入第" + q + "物品的价值");
int l = scanner.nextInt();
v[q] = l;
}
System.out.println("请按顺序输入各物品的重量");
for (int qq = 1; qq < n+1; qq++) {
System.out.println("请输入第" + qq + "物品的重量");
int ll = scanner.nextInt();
w[qq] = ll;
}
int[][] m = new int[n+1][c+1];
for (int i = 0; i < m.length; ++i) {
for (int j = 0; j < m[i].length; ++j)
m[i][j] = 0;
}
int[] x = new int[n+1];
knapsack1 knapsack11 = new knapsack1();
knapsack11.knapsack(v, w, c, m);
knapsack11.traceback(m, w, c, x);
for (int[] h : m) {
for (int i : h) {
System.out.printf("%d\t", i);
}
System.out.println();
}
for (int qqqq = 1; qqqq < x.length; qqqq++) {
System.out.print(x[qqqq]);
}
System.out.println("0-1背包最优解:最多装价值"+m[1][c]+"的东西");
System.out.println("装入的物品为:");
for (int ppp=0;ppp<x.length;ppp++){
if (x[ppp]==1){
System.out.println("第"+ppp+"个物品");
}
}
}
}
public class knapsack1 {
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 > 1; i--) {
jMax = Math.min(w[i] - 1, c);
for (int j = 0; j <= jMax; j++)
m[i][j] = m[i + 1][j];
for (int j = w[i]; j <= c; j++)
m[i][j] = Math.max(m[i + 1][j], m[i + 1][j - w[i]] + v[i]);
}
if(c>=w[1])
m[1][c]=Math.max(m[2][c], m[2][c-w[1]]+v[1]);
else
m[1][c]=m[2][c];
}
public static void traceback(int [][]m,int []w,int c,int []x){
int n=w.length-1;
for (int i=1;i<n; i++)
if(m[i][c]==m[i+1][c])x[i]=0;
else {
x[i]=1;c-=w[i];
}
x[n]=(m[n][c]>0)?1:0;
}
}
可以依次输入10,5
6 3 5 4 6
2 2 6 5 4 验证,将v[0]和w[0]置空是因为没有物品0.最后可以得最优解:放入第1,2,5个物品,最大价值为15.