记录编号 264034 评测结果 A
题目名称 [POJ 1014] 大理石分割 最终得分 100
用户昵称 Gravatar农场主 是否通过 通过
代码语言 C++ 运行时间 0.002 s
提交时间 2016-05-27 09:14:48 内存使用 0.44 MiB
显示代码纯文本
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
bool d[20000*7]={0};
vector<int> t;
int a[7]={0};
int n=6,mid=0;
void work(){
	memset(d,0,sizeof(d));
	t.clear();
	mid=0;
	for (int i=1;i<=n;i++){
		mid+=a[i]*i;
		for (int j=0;a[i];j++){
			if (a[i]>=(1<<j)){
				a[i]-=(1<<j);
				t.push_back(i*(1<<j));
			}
			else {
				t.push_back(i*a[i]);
				a[i]=0;
			}
		}
	}
	int tot=0;
	if (mid%2==1) {
		printf("Can't be divided.\n");
		return;
	}
	mid/=2;
	d[0]=1;
	for (int i=0;i<t.size();i++){
		for (int j=tot;j>=0;j--){
			if (d[j]==1){
				d[j+t[i]]=1;
			}
		}
		if (tot+t[i]<=mid) tot+=t[i];
		if (d[mid]==1) break;
	}
	if (d[mid]==1) printf("Can be divided.\n");
	else printf("Can't be divided.\n");
}
int main(){
	freopen("dividestone.in","r",stdin);
	freopen("dividestone.out","w",stdout);
	for (int k=1;;k++){
		for (int i=1;i<=n;i++){
			scanf("%d",&a[i]);
		}
		if (!a[1]&&!a[2]&&!a[3]&&!a[4]&&!a[5]&&!a[6]) break;
		printf("\nCollection #%d:\n",k);
		work();
	}
	return 0;
}