主要的实现逻辑是两层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]);
}
}