洛谷P1120小木棍[DFS]
2016-08-13 22:10
204 查看
题目描述
乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50。现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。
给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。
输入输出格式
输入格式:输入文件共有二行。
第一行为一个单独的整数N表示砍过以后的小木棍的总数,其中N≤60
(管理员注:要把超过50的长度自觉过滤掉,坑了很多人了!)
第二行为N个用空个隔开的正整数,表示N根小木棍的长度。
输出格式:
输出文件仅一行,表示要求的原始木棍的最小可能长度
输入输出样例
输入样例#1:9 521521521
输出样例#1:
6 ----------------------------------------- [DFS+剪枝] 考虑枚举这个长度,发现答案区间为[mx,sum]且len|sum 剪枝:1.从大到小排序,对于一大大木棍小木棍是从长到短组装的,体现在now上(不用这个now优化也行) 2.当一个小木棍接入后,当前处理的大木棍刚好达到要求的长度的话,没必要用更多的小木棍代替这个刚接入的小木棍,体现在l+a[i]==lenbreak 3.当处理完一个大木棍之后,接入下一个大木棍的第一根小木棍用剩下的最长的小木棍,体现在l==0break DFS----->当前使用小木棍数,当前组装的长度,当前从大到小到了哪个木棍
// //main.cpp //小木棍 // //Createdbyabcon16/8/13. //Copyright©2016年abc.Allrightsreserved. // #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> usingnamespacestd; constintN=65; intn,a ,tmp,cnt=0,mx=-1,sum=0; boolcmp(inta,intb){ returna>b; } intlen,ok=0,vis ; voiddfs(inttot,intl,intnow){ if(ok)return; if(tot==cnt&&l==0){ok=1;return;} intlast=-1; for(inti=now;i<=cnt;i++) if(vis[i]==0&&l+a[i]<=len){//printf("t%d%d\n",i,l); if(l+a[i]==last)continue; last=l+a[i]; vis[i]=1; if(l+a[i]==len)dfs(tot+1,0,1); elsedfs(tot+1,l+a[i],i+1); vis[i]=0; if(l==0||l+a[i]==len)break; } } intmain(intargc,constchar*argv[]){ scanf("%d",&n); for(inti=1;i<=n;i++){ scanf("%d",&tmp); if(tmp<=50){a[++cnt]=tmp;mx=max(mx,tmp);sum+=tmp;} } sort(a+1,a+1+cnt,cmp); for(len=mx;len<=sum;len++) if(sum%len==0){ ok=0;//cout<<len<<"\n"; dfs(0,0,1); if(ok)break; } cout<<len; return0; }
相关文章推荐
- 洛谷P1120 小木棍(dfs)
- 洛谷p1120小木棍【数据加强版】c++
- 洛谷 【P1120】 小木棍
- 洛谷 P1120 小木棍 题解
- 洛谷—— P1120 小木棍 [数据加强版]
- 【搜索】洛谷 P1120 小木棍 [数据加强版]
- AC日记——小木棍【数据加强版】 洛谷 P1120
- 洛谷P1120 小木棍
- 洛谷 P1120 小木棍 [数据加强版 ]
- 洛谷P1120 小木棍 [数据加强版]
- 洛谷 P1120 小木棍 [数据加强版]
- 洛谷 P1120 小木棍[数据加强版]
- 【洛谷】P1120 小木棍[数据加强版]
- 洛谷P2420 让我们异或吧 树上差分 dfs
- 洛谷P1101(dfs)
- 洛谷 1434_滑雪_dfs
- 【洛谷2017年3月月赛】Round1第四题-环套树森林DFS+贪心
- 洛谷 P3385 判负环dfs
- P1120 小木棍 [数据加强版]
- 洛谷 P1219 八皇后 (dfs)