您的位置:首页 > 其它

[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'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: