您的位置:首页 > 其它

poj 1011 Sticks

2010-07-14 16:05 351 查看
Time Limit: 1000MSMemory Limit: 10000K
Total Submissions: 69843Accepted: 15257
本题对本人来说有点小难啊,交了n次都是tle后来看了别人的代码才知道加了一句剪枝,但这一句话是什么意思,我到现在也没看懂,如果哪位大牛看到此随笔,麻烦给我也解释一下。能举出例子最好!

代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int n,used[100],sticks[100];
int compare(const void *a,const void *b)
{
return *(int *)b-*(int *)a;
};
int test(int unused,int left,int len)
{
int i;
if(unused==0 && left==0)
return 1;
if(left==0)
left=len;
for(i=1;i<=n;i++)
{
if(used[i])
continue;
if(sticks[i]>left)
continue;
used[i]=1;
if(test(unused-1,left-sticks[i],len))
return 1;
used[i]=0;
if(sticks[i]==left || left==len)
break;
}
return 0;
}
int main()
{
int i,max,sum;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
max=0;sum=0;
for(i=1;i<=n;i++)
{
used[i]=0;
scanf("%d",&sticks[i]);
sum+=sticks[i];
}
qsort(sticks+1,n,sizeof(sticks[0]),compare);
max=sticks[1];
for(i=max;i<=sum;i++)
{
if(sum%i!=0)
continue;
if(test(n,i,i))
{
printf("%d\n",i);
break;
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: