[hdu1059]Dividing 多重背包

来源:互联网 发布:自动排料软件 编辑:程序博客网 时间:2024/05/18 02:47
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'

 

0 0
原创粉丝点击