1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| package class075;
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StreamTokenizer; import java.util.Arrays;
public class Code02_BoundedKnapsackWithBinarySplitting {
public static int MAXN = 1001;
public static int MAXW = 40001;
public static int[] v = new int[MAXN];
public static int[] w = new int[MAXN];
public static int[] dp = new int[MAXW];
public static int n, t, m;
public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); while (in.nextToken() != StreamTokenizer.TT_EOF) { n = (int) in.nval; in.nextToken(); t = (int) in.nval; m = 0; for (int i = 1, value, weight, cnt; i <= n; i++) { in.nextToken(); value = (int) in.nval; in.nextToken(); weight = (int) in.nval; in.nextToken(); cnt = (int) in.nval; for (int k = 1; k <= cnt; k <<= 1) { v[++m] = k * value; w[m] = k * weight; cnt -= k; } if (cnt > 0) { v[++m] = cnt * value; w[m] = cnt * weight; } } out.println(compute()); } out.flush(); out.close(); br.close(); }
public static int compute() { Arrays.fill(dp, 0, t + 1, 0); for (int i = 1; i <= m; i++) { for (int j = t; j >= w[i]; j--) { dp[j] = Math.max(dp[j], dp[j - w[i]] + v[i]); } } return dp[t]; }
}
|