主要的实现逻辑是两层for循环,然后套用公式就可以得出结果
//0/1背包问题 public class Test { //B(k,w)表示的是当背包容量是w时,可以装前k件商品的最大价格 /** |--- B(k-1,w) 表示k太重了 * B(k,w) = | * |--- -- max { B(k-1,w-第k件的重量)+第k件的价格 表示选择第k件商品 * { B(k-1,w) 表示不选择第k件商品 */ //商品的重量分别是2 3 4 5 9 ,对应价格分别是3 4 5 8 10 , 背包的容量是20 ,求背包最大可以装的价格是多少 public static void main (String [] args){ int K = 6; int N =21; int [][] arr = new int[K][N]; //默认是都是0 int[] w = {0, 2, 3, 4, 5, 9}; int[] v = {0, 3, 4, 5, 8, 10}; for(int k=1; k<K; k++){ //c表示背包容量,两层遍历后就是求arr[5][20] ,表示当背包容量是20,商品可以取0-5时,可以装的最大价格是多少 for(int c=1; c<N; c++){ if(w[k]>c){ //第k件商品太重了 arr[k][c] = arr[k-1][c]; }else{ arr[k][c] = Math.max(arr[k - 1][c - w[k]] + v[k], arr[k - 1][c]); } } } System.out.println(arr[5][20]); } }