HDU 1455 Sticks
2011-06-25 13:43
197 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1455
一. dfs()有三个参数,一个记录组成好了多少根,一个记录当前的组成长度,还有一个就是当前是哪根
二. 开始要对Len从大到小排序一下,这个没怎么想明白,网上说这样可以减少比较的次数,我的想法是如果是从小到大排,那么你之前组成的棒子肯定是由很多长度短的组成的,余下的都是长度比较大的,但是实际情况大多数应该是长的和短的相结合构成目标长度,所以你先把短的用掉了,之后还要回溯,要是从大到小就不会,因为你大的也许两个到三个相加就已经超出目标长度了,这样可以减少回溯,那么次数也就减少了很多
#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从大到小排序一下,这个没怎么想明白,网上说这样可以减少比较的次数,我的想法是如果是从小到大排,那么你之前组成的棒子肯定是由很多长度短的组成的,余下的都是长度比较大的,但是实际情况大多数应该是长的和短的相结合构成目标长度,所以你先把短的用掉了,之后还要回溯,要是从大到小就不会,因为你大的也许两个到三个相加就已经超出目标长度了,这样可以减少回溯,那么次数也就减少了很多
相关文章推荐
- HDU 1455 Sticks(DFS+剪枝)
- day3 HDU 1455 Sticks
- HDU_1455 && POJ_1011 Sticks (dfs)
- HDU 1455 POJ 1011 UVA 307 Sticks
- HDU 1455 Sticks(回溯,减枝很巧妙)
- hdu-1455-Sticks-深搜+剪枝
- HDU 1455 Sticks
- hdu 1455 Sticks
- hdu1455 Sticks(搜索+剪枝+剪枝+.....+剪枝)
- HDU-1455 Sticks 经典dfs剪枝
- hdu 1455 Sticks(经典搜索)
- hdu 1455 Sticks
- HDU 1455 Sticks
- HDU 1455 Sticks
- (step4.3.10)hdu 1455(Sticks——DFS)
- hdu 1455 Sticks(DFS+剪枝)
- HDU 1455 Sticks(dfs+强剪枝)
- HDU 1455 POJ 1011 Sticks 搜索
- HDU--1455 -- Sticks [DFS] [剪枝优化]
- HDU 1455——Sticks(神棍)