POJ 1011 Sticks
来源:互联网 发布:数据结构java版 编辑:程序博客网 时间:2024/06/05 06:08
用当前的木棍拼木棒,问能拼成x(x>=1)根等长木棒的最小长度是多少
首先考虑由最大的木棒开始拼,边界条件为所有木棍拼接成一根木棒,因此答案就在max~sum之间枚举。注意一个需要满足的性质是,木棒的总长度sum%当前长度len==0,因为要拼成整数个等长木棒,进行搜索即可
#include<iostream>#include<algorithm>#include<cstring>using namespace std;const int size = 65;int len , stick[size];bool vis [size];int n,sum;bool flag;bool cmp(int a,int b){ return a>b;}void cal(int dep, int now_len, int u){ if(flag ) return ; if(now_len == len ) { if(dep ==n) { flag = true; } else cal(dep,0,0); return ; } else if(now_len == 0 ) { int k = 0; while(vis[k]) k++; vis[k] = true; cal(dep+1, stick[k], k+1); vis[k] = false; } else { for(int i = u; i < n;i++) { if(!vis[i]&&now_len+ stick[i]<=len) if(!vis[i-1]&&stick [i-1] == stick[i]) continue; else { vis[i] = true; cal(dep+1, now_len+ stick[i],u+1); vis[i] = false; } } }}int main(){ while(cin>>n,n) { sum = 0; flag = false; for(int i =0; i< n ; i++) { cin>>stick[i]; sum+= stick[i]; } sort(stick, stick + n,cmp); int maxn = stick[0]; for( len = maxn; len< sum; len++) { if(sum % len == 0 ) { memset(vis, 0, sizeof (vis)); cal(0,0,0); if(flag) break; } } cout<<len<<endl; }return 0;}
阅读全文
0 0
- poj 1011-sticks
- POJ 1011 Sticks
- poj 1011 Sticks
- poj 1011 Sticks
- POJ 1011 Sticks
- poj 1011 Sticks
- POJ 1011 Sticks
- poj 1011 sticks
- POJ 1011 Sticks
- poj 1011 sticks
- POJ 1011 Sticks
- POJ 1011: Sticks
- poj 1011 Sticks
- poj 1011 Sticks【dfs】
- hdu1455 poj 1011 sticks
- poj 1011 Sticks
- POJ 1011 Sticks
- POJ 1011 Sticks
- 二十三种设计模式之组合模式
- php验证库
- FSM(状态机)、HFSM(分层状态机)、BT(行为树)的区别
- 1293 球与切换器
- 函数的重载
- POJ 1011 Sticks
- 学习swift 《kvc和kvo的简单使用》
- 关于linuxonandroid的理解
- 时间戳转化为日期的方法
- python3爬虫获取html内容及各属性值
- UVA
- Spring IOC
- 大数据学习笔记:编写脚本分发配置,数据分布,以及使用代码打印调试信息
- 函数重载的二义性