AcWing 9. 【Java】分组背包问题
原题链接
中等
作者:
tt2767
,
2020-01-12 22:03:11
,
所有人可见
,
阅读 837
/*
1. 状态定义: f[j] 为 体积<= j 时的最大值
2. 状态计算: 对于每个分组都更新 : f[j] = MAX(f[j - v[i]] + w[i])
3.边界: f[~] = 0
*/
import java.util.*;
public class Main{
void run(){
int N = jin.nextInt();
int V = jin.nextInt();
int[] f = new int[102];
for (int i = 0 ; i < N ; i ++){
int S = jin.nextInt();
v.clear();
w.clear();
for (int k = 0 ; k < S ; k ++){
v.add(jin.nextInt());
w.add(jin.nextInt());
}
for (int j = V ; j >= 0 ; j --){ // 把 >v[i] 的条件拆出来,因为是以每个组为单位
for (int k = 0 ; k < S ; k ++){
if (j >= v.get(k)) // ?
f[j] = Math.max(f[j], f[j - v.get(k)] + w.get(k));
}
}
}
System.out.println(f[V]);
}
List<Integer> v = new ArrayList<Integer>();
List<Integer> w = new ArrayList<Integer>();
Scanner jin = new Scanner(System.in);
public static void main(String[] args) {new Main().run();}
}