您的位置:首页 > 其它

hdu 1455 sticks

2014-05-08 20:08 357 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1455

题目大意是给你一堆木棍,然后让他们互相之间随意拼接,组成任意多个相同长度的 新木棍,要求新木棍们的长度最短

一道dfs,但是似乎要剪枝,我一开始也没有想到好的方法= =

最后网上看了题解以后跟着做的...

stick数组表示当前木棍的长度,然后used数组表示已经用来拼接过的木棍

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <string>
using namespace std;
int flag;
int n;
int len,num;
int stick[100],used[100];
bool cmp(int a,int b)
{
return a>b;
}
void dfs(int pos,int cur,int cnt)
{
if(flag)
return ;
if(cur==len)
{
cnt++;
if(cnt==num)
{
flag=1;
return ;
}
dfs(0,0,cnt);
return;
}
if(pos==n)
return; //已搜索整个数组
int pre=-1;
for(int i=pos;i<n;i++)
{
//第i根stick没有用过;之前没有与他等长的stick失效,现有长度加上sticks[i]不大于理论长度
if(!used[i]&&pre!=stick[i]&&cur+stick[i]<=len)
{
pre=stick[i];
used[i]=1;
dfs(i+1,cur+stick[i],cnt);
used[i]=0;
if(flag)//满足条件,返回
return ;
//最长的一根stick[i]要被废弃,则表示至少有一根最长的要被废弃,不合适
if(pos==0)
return;
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
int sum;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
sum=0;
for(int i=0;i<n;i++)
{
scanf("%d",&stick[i]);
sum+=stick[i];
}
sort(stick,stick+n,cmp);
int max=stick[0];
for(len=max;len<=sum;len++)
{
if(len>(sum+1)/2)
{
len=sum;
break;
}
if(sum%len==0)
{
num=sum/len;
memset(used,0,sizeof used);
flag=0;
dfs(0,0,0);
if(flag)
break;
}
}
printf("%d\n",len);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: