| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
程序应该没有BUG,看来是剪枝的问题?如何剪呢?就是先std::sort,然后枚举可能的长棍长,如果是总长度的约数就DFS。
DFS的时候,长棍长度l固定,开始的时候剩余长度lea=l,top=n。
每次从top往下检查没有用过的棍子(也就是从长到短),从lea中截去最长的短棍p[i]。
截去p[i]之后,搜索lea-p[i],top=i.
如果lea=0了,让lea=l,top=n.
Submit>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>但是TLE了。code见下。
#include <cstdio>
#include <algorithm>
const int maxn=64;
int i,n,l,t,tmp,p[maxn],s[maxn];
bool u[maxn];
bool DFS(int depth,int lea,int top)
{
if(depth==n) return true;
if(lea>s[top]) return false;
if(lea==0)
{
lea=l;
top=n;
}
for(int i=top-1;i>=0;--i)
if(u[i]&&p[i]<=lea)
{
u[i]=false;
if(DFS(depth+1,lea-p[i],i)) return true;
u[i]=true;
}
return false;
}
int main()
{
for(;;)
{
scanf("%d",&n);
if(n==0) return 0;
for(t=i=0;i!=n;++i)
{
scanf("%d",&tmp);
if(tmp<=50) t+=p[i]=tmp;
}
std::sort(p,p+n);
s[0]=0;
for(i=1;i!=n;++i) s[i]=s[i-1]+p[i-1];
for(l=p[n-1];l!=t;++l)
if(t%l==0)
{
memset(u,1,sizeof(u));
if(DFS(0,0,0))
{
printf("%d\n",l);
break;
}
}
}
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator