您的位置:首页 > 其它

HDU 1455 Sticks

2014-10-10 13:53 351 查看
这题的思路是从书上看来的,不过好歹也弄明白原因了;

注释清楚 方便以后看看.

题意是 有若干 长度相同的棍子..英语水平有限,一开始没看懂,以为只有1根,要多多练习啊..

#include<iostream>
#include<algorithm>
#define maxn  70
using namespace std;
int stick[maxn];
bool visit[maxn];
int length,pos,num,n,sum;
int cmp(int x,int y)
{
return x>y ;
}
bool dfs(int count,int now,int pos)
{
int i;
bool sign=(now==0?true:false);//标记当前长度
if(count==num) return true;
for(i=pos;i<n;i++)
{
if(visit[i]) continue;//用过了就不用考虑了
if(now+stick[i]==length)
{
visit[i]=true;//标记棍子是否使用
if(dfs(count+1,0,0))//已经完成当前棍子匹配,进行下一根棍子的的匹配
return true;
visit[i]=false;//无法完成匹配,则应重置
return false;
}

else if(now+stick[i]<length)
{
visit[i]=true;
if(dfs(count,now+stick[i],i))//继续搜索没有用过的棍子以完成匹配
return true;
visit[i]=false;
if(sign) return false;//长度为0说明当前长度匹配不成功,继续下一个长度的搜索;
while(stick[i]==stick[i+1]) i++;//重要剪枝,相同长度的棍子没必要再搜索
}
}
return false;

}
int main()
{
//freopen("1455.txt","r",stdin);
int i;
while(~scanf("%d",&n),n)
{
sum=0;
for(i=0;i<n;i++)
scanf("%d",stick+i),sum+=stick[i];
sort(stick,stick+n,cmp);//从大到小排;
for(length=stick[0];length<=sum;length++)
{
if(sum%length==0)
{
num=sum/length;
memset(visit,false,sizeof(visit));
if(dfs(1,0,0))
{
printf("%d\n",length);
break;
}
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: