您的位置:首页 > 其它

HDU 1455 Sticks

2011-06-25 13:43 197 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1455

#include<iostream>
#include<algorithm>
using namespace std;
#define N 64
int len
;
bool h
;
int n,s,l;
int Count;
bool flag;
bool cmp(int x,int y)
{
return x>y;
}
void dfs(int sum,int x,int c)
{
if(c==Count)
{
flag=1;
return;
}
if(flag)
return;
if(sum==l)
dfs(0,0,c+1);
else
{
int pre=-1;
for(int i=x;i<n;i++)
if(!h[i]&&len[i]!=pre&&len[i]+sum<=l)
{
h[i]=1;
pre=len[i];
dfs(sum+len[i],x+1,c);
h[i]=0;
if(flag)
return;
}
}
}
int main(void)
{
while(scanf("%d",&n),n)
{
s=0;
int Min=INT_MAX;
for(int i=0;i<n;i++)
{
scanf("%d",&len[i]);
s+=len[i];
if(Min>len[i])
Min=len[i];
}
sort(len,len+n,cmp);
flag=0;
for(int i=Min;i<=s;i++)
if(s%i==0)
{
l=i;
Count=s/i;
memset(h,0,sizeof(h));
dfs(0,0,0);
if(flag)
break;
}
printf("%d/n",l);
}
}


一. dfs()有三个参数,一个记录组成好了多少根,一个记录当前的组成长度,还有一个就是当前是哪根

二. 开始要对Len从大到小排序一下,这个没怎么想明白,网上说这样可以减少比较的次数,我的想法是如果是从小到大排,那么你之前组成的棒子肯定是由很多长度短的组成的,余下的都是长度比较大的,但是实际情况大多数应该是长的和短的相结合构成目标长度,所以你先把短的用掉了,之后还要回溯,要是从大到小就不会,因为你大的也许两个到三个相加就已经超出目标长度了,这样可以减少回溯,那么次数也就减少了很多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: