hdu 1455 sticks
2014-05-08 20:08
357 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1455
题目大意是给你一堆木棍,然后让他们互相之间随意拼接,组成任意多个相同长度的 新木棍,要求新木棍们的长度最短
一道dfs,但是似乎要剪枝,我一开始也没有想到好的方法= =
最后网上看了题解以后跟着做的...
stick数组表示当前木棍的长度,然后used数组表示已经用来拼接过的木棍
题目大意是给你一堆木棍,然后让他们互相之间随意拼接,组成任意多个相同长度的 新木棍,要求新木棍们的长度最短
一道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; }
相关文章推荐
- HDU 1455 Sticks
- Hdu1455 Sticks
- (HDU - 1455)Sticks
- hdu 1455/poj 1011 Sticks(DFS剪枝神题)
- HDU 1455 Sticks
- 杭电hdu 1455 sticks 深度优先搜索
- hdu 1455 Sticks(DFS+剪枝)
- 文章标题 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 ——sticks
- uva 215 hdu 1455 uvalive5522 poj 1011 sticks
- HDU 1455 Sticks(分组)
- HDU 1455 Sticks
- 【DFS】hdu 1455 Sticks
- HDU 1455 sticks(dfs+剪枝)