java版本
对于C++里的结构体,我们可以使用一个类来替代,本混合背包就是01背包、无穷背包和多重背包的集合,我们使用二进制优化把多重背包转化为01背包问题,在遍历的时候判断背包类型,01背包使用01背包的转移方程,无穷背包使用无穷背包转移方程,其实01和无穷背包的转移方程在使用空间优化的时候是一样的,只是遍历顺序不同,都是f[j] = f[j - v[i]] + w[i]
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(), m = sc.nextInt();
List<Thing> things = new ArrayList<>();
for(int i = 0; i < n; i++){
int a = sc.nextInt(), b = sc.nextInt(), s = sc.nextInt();
if(s == -1){
things.add(new Thing(-1,a,b));
}else if(s == 0){
things.add(new Thing(0,a,b));
}else{
for(int k = 1; k <= s; k*= 2){
things.add(new Thing(-1,a*k,b*k));
s -= k;
}
if(s > 0){
things.add(new Thing(-1,a*s,b*s));
}
}
}
int[] f = new int[m+1];
for(Thing thing : things){
if(thing.kind == -1){
for(int j = m; j >= thing.v; j--){
f[j] = Math.max(f[j],f[j-thing.v] + thing.w);
}
}else{
for(int j = thing.v; j <= m; j++){
f[j] = Math.max(f[j],f[j-thing.v] + thing.w);
}
}
}
System.out.println(f[m]);
}
static class Thing{
int kind, v, w;
public Thing(int kind, int v, int w){
this.kind = kind;
this.v = v;
this.w = w;
}
}
}