HDU 1455 Sticks
2014-10-10 13:53
351 查看
这题的思路是从书上看来的,不过好歹也弄明白原因了;
注释清楚 方便以后看看.
题意是 有若干 长度相同的棍子..英语水平有限,一开始没看懂,以为只有1根,要多多练习啊..
注释清楚 方便以后看看.
题意是 有若干 长度相同的棍子..英语水平有限,一开始没看懂,以为只有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; }
相关文章推荐
- hdu 1455 Sticks(dfs+可行性剪枝)
- Hdu1455 Sticks
- HDU 1455 Sticks
- hdu-1455-Sticks-深搜+剪枝
- HDU 1455——Sticks(神棍)
- 文章标题 HDU 1455 : Sticks(dfs+剪枝)
- HDU 1455 Sticks
- HDU 1455 Sticks(分组)
- hdu 1455(Sticks 经典深搜)
- HDU 1455 Sticks
- hdu 1455 Sticks(DFS+剪枝)
- hdu 1455 sticks
- HDU 1455 POJ 1011 Sticks 搜索
- hdu 1455 Sticks
- hdu 1455 hdu 1455 Sticks
- HDU 1455 Sticks
- HDU 1455 Sticks
- hdu 1455 sticks(经典深搜+剪枝技巧)
- hdu 1455 ——sticks
- HDU 1455 Sticks(回溯,减枝很巧妙)