多重背包
package com.wd.knapsack;
public class Knapsack_mutil {
public static void main(String[] args) {
// 总个数
int count = 0;
// 总容量
int amount = 0;
// 每个物品的重量
int[] w = new int[count + 1];
// 每个物品的价值
int[] val = new int[count + 1];
// 每个物品的个数
int[] num = new int[count + 1];
// 进行二进制拆分优化后
// 每个物品的重量
int[] w1 = new int[count + 1];
// 每个物品的价值
int[] val1 = new int[count + 1];
//优化后的数量
int total = 0;
for (int i = 1; i <= count; i++) {
for(int j =0;j<num[i];j<<=1){
val1[total] = j*w[i];
w1[total++] = j*w[i];
num[i]-=j;
}
if(num[i]>0){
val1[total] = num[i]*w[i];
w1[total++] = num[i]*w[i];
}
}
// 总价值opt
int[] opt = new int[count + 1];
for(int i= 0;i<total;i++){
for(int j=amount;j>=w1[i];j++){
opt[j] =opt[j] = Math.max(opt[j], opt[j - w1[i]] + val1[i]);
}
}
// // 总价值opt
// int[] opt = new int[count + 1];
// for (int i = 1; i <= count; i++) {
// for (int j = amount; j >=w[i]; j--) {
// for(int k=0;(k*w[i]<=j)&&(k<=num[i]);k++){
// opt[j] = Math.max(opt[j], opt[j - k*w[i]] + val[i]);
// }
// }
// }
}
}