[hdu1059]Dividing 多重背包
2014-10-15 19:12
393 查看
import java.io.*; import java.util.Arrays; public class Main { //dp[i] = dp[i] || dp[i-bag[j]] //01背包空间优化一下 static boolean judge(boolean dp[], int bag[], int num, int tg) { Arrays.fill(dp, false); dp[0] = true; for (int i = 0; i < num; ++i) { for (int j = tg; j >= bag[i]; --j) { if (dp[j-bag[i]]) dp[j] = true; } } return dp[tg]; } public static void main(String args[]) throws IOException { final int MAX = 130000; boolean [] dp = new boolean[MAX]; int [] bag = new int[MAX]; int [] a = new int[10]; StreamTokenizer cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); PrintWriter cout = new PrintWriter(new OutputStreamWriter(System.out)); for (int cas = 1;; ++cas) { int sum = 0; for (int i = 1; i <= 6; ++i) { cin.nextToken(); a[i] = (int)cin.nval; sum += a[i] * i; } if (sum == 0) break; int num = 0; for (int i = 1; i <= 6; ++i) { int m = 1, n = 1; while (n <= a[i]) { if (a[i] >= n) bag[num++] = m * i; else bag[num++] = (a[i] - n) * i; if ((m << 1) + n <= a[i]) m <<= 1; n += m; } } cout.println("Collection #" + cas + ":"); cout.println(((sum&1) == 0 && judge(dp, bag, num, sum>>1) ? "Can" : "Can't") + " be divided."); cout.println(""); } cout.flush(); } }
Java搞的时候要小心'\n'字符的问题,在toj上println中加入'\n'是可以A的,但是hdu很奇葩,会出现PE问题,所以空行一定要println("")不能直接在上一句println中接'\n'
相关文章推荐
- hdu1059 Dividing (多重背包)
- hdu1059 Dividing 【多重背包】
- HDU 1059 Dividing dp背包题解
- HDU 1059 Dividing(多重背包)
- hdu 1059 Dividing(完全背包)
- HDU 1059 Dividing 多重背包 .
- (step3.3) hdu 1059(Dividing——多重背包)
- [HDU 1059] Dividing (多重背包+二进制优化)
- HDU 1059 POJ 1014 Dividing (多重背包)
- HDU 1059 Dividing(多重背包)
- HDU1059——Dividing多重背包
- HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化)
- poj1014 hdu1059 Dividing 多重背包
- hdu 1059 Dividing(完全背包)
- hdu 1059 Dividing (多重背包)
- HDU 1059 Dividing (多重背包问题)
- 【背包专题】G - Dividing hdu 1059【多重背包】
- HDU 1059 Dividing 【DP背包】
- hdu1059 Dividing(完全背包)
- hdu 1059 Dividing 多重背包