标签:
| Time Limit: 1000MS | Memory Limit: 32768KB | 64bit IO Format: %I64d & %I64u |
Description
Input
Output
Sample Input
1 0 1 2 0 0 1 0 0 0 1 1 0 0 0 0 0 0
Sample Output
Collection #1: Can‘t be divided. Collection #2: Can be divided.
/*
Author: 2486
Memory: 1152 KB Time: 0 MS
Language: G++ Result: Accepted
*/
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=20005;
int f[maxn<<2],v[maxn],w[maxn],n[maxn];
int a[6],mid;
void zeroonepack(int w,int v) {
for(int i=mid; i>=w; i--) {
f[i]=max(f[i],f[i-w]+v);
}
}
void completepack(int w,int v) {
for(int i=w; i<=mid; i++) {
f[i]=max(f[i],f[i-w]+v);
}
}
void multipack(int w,int v,int n) {
if(w*n>mid) {
completepack(w,v);
return ;
} else {
for(int k=1; k<n; k<<=1) {
zeroonepack(k*w,k*v);
n-=k;
}
zeroonepack(n*w,n*v);
}
}
int main() {
int number=1;
while(~scanf("%d%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5])) {
int sum=0;
for(int i=0; i<6; i++) {
sum+=a[i]*(i+1);
}
mid=sum>>1;
for(int i=0; i<=sum; i++) {
f[i]=-maxn;
}
f[0]=0;
if(!sum)break;
printf("Collection #%d:\n",number++);
if(sum&1) {
printf("Can't be divided.\n");
} else {
for(int i=0; i<6; i++) {
multipack(i+1,i+1,a[i]);
}
if(f[mid]==mid) {
printf("Can be divided.\n");
} else {
printf("Can't be divided.\n");
}
}
printf("\n");
}
return 0;
}
/*
Author: 2486
Memory: 3828 KB Time: 47 MS
Language: G++ Result: Accepted
*/
#include <cstdio>
#include <string>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=200005;
int sizes[maxn<<2],value[maxn<<2];
int a[6];
int dp[maxn<<2];
int main() {
int cas=0;
while(~scanf("%d%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5])) {
int sum=0,mid;
for(int i=0; i<6; i++) {
sum+=a[i]*(i+1);
}
if(!sum)break;
printf("Collection #%d:\n",++cas);
int count=0;
mid=sum>>1;
if(sum&1) {
printf("Can't be divided.\n");
printf("\n");
continue;
}
for(int i=0; i<6; i++) {
for(int j=1; j<=a[i]; j<<=1) {
sizes[count]=j*(i+1);
value[count++]=j*(i+1);
a[i]-=j;
}
if(a[i]>0) {
sizes[count]=a[i]*(i+1);
value[count++]=a[i]*(i+1);
}
}
memset(dp,0,sizeof(dp));
for(int i=0; i<count; i++) {
for(int j=mid; j>=sizes[i]; j--) {
dp[j]=max(dp[j],dp[j-sizes[i]]+value[i]);
}
}
if(dp[mid]==mid) {
printf("Can be divided.\n");
} else {
printf("Can't be divided.\n");
}
printf("\n");
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/qq_18661257/article/details/47107297