用DFS可以做吧, 注意剪枝
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int a[7],sum,flag;
void DFS(int num)
{
if(flag)
return;
if(sum==num)
{
flag=1;
return;
}
for(int i=6;i>=1;i--)
{
if(a[i]&&num+i<=sum)
{
a[i]--;
DFS(num+i);
if(flag)
return;
}
}
}
int main()
{
int cas=1;
while(scanf("%d",&a[1])!=EOF)
{
sum=a[1]*1;
flag=0;
for(int i=2;i<=6;i++)
{
scanf("%d",&a[i]);
sum+=a[i]*i;
}
if(!sum)
break;
printf("Collection #%d:\n",cas++);
if(sum&1)
{
printf("Can't be divided.\n\n");
continue;
}
sum/=2;
DFS(0);
if(!flag)
printf("Can't be divided.\n");
else
printf("Can be divided.\n");
printf("\n");
}
return 0;
}
代码(背包):
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAX 7
using namespace std;
int a[MAX],sum,flag;
bool check[300001];
void Divide(int index)
{
memset(check,0,sizeof(check));
int Max=0;
check[0]=1;
for(int i=index;i>=0;i--)
{
if(a[i])
{
for(int j=Max;j>=0;j--)
{
if(check[j])
{
for(int k=a[i];k>=1;k--)
{
check[j+k*i]=1;
}
Max=max(j+a[i]*i,Max);
if(check[sum])
{
flag=1;
return;
}
}
}
}
}
}
int main()
{
int cas=1;
while(scanf("%d",&a[1])!=EOF)
{
sum=a[1];
for(int i=2;i<=6;i++)
{
scanf("%d",&a[i]);
sum+=a[i]*i;
}
flag=0;
if(!sum)
break;
printf("Collection #%d:\n",cas++);
if(sum&1)
{
printf("Can't be divided.\n\n");
continue;
}
sum/=2;
Divide(6);
if(flag)
printf("Can be divided.\n\n");
else
printf("Can't be divided.\n\n");
}
return 0;
}