第一次我采用从0开始搜索的策略,超时
第二次我采用从15开始做的,没有超时
#include<iostream>
#include<stdio.h>
using namespace std;
#define MAX 11
int map[MAX];
#define MAXNUM 100009
int dp[MAXNUM];
int sum;
int bfs(int level,int value)
{
//越界
if(level==0||value==0){
if(value==0)
return true;
}
int i=1;
for(i=map[level];i>=0;i--)
{
if(level-1>=0&&value-i*level>=0&&bfs(level-1,value-i*level))
{
return 1;
}
}
return 0;
}
int main()
{
//freopen("in.txt","r",stdin);
int k=1;
while(1)
{
int i=0;sum=0;
for(i=1;i<=10;i++)
{
scanf("%d",&map[i]);
sum+=map[i]*i;
}
if(sum==0)
return 0;
for(i=0;i<MAXNUM;i++)
dp[i]=0;
//如果和是奇数,那么肯定平分不了
if(sum%2==1)
{
printf("#%d:Can't be divided.\n\n",k);
k++;
}
else
{
int result=bfs(10,sum/2);
if(result)
{
printf("#%d:Can be divided.\n\n",k);
k++;
}
else
{
printf("#%d:Can't be divided.\n\n",k);
k++;
}
}
}
return 0;
}