[搜索]poj1011
来源:互联网 发布:mysql系统表 编辑:程序博客网 时间:2024/06/01 13:08
题意:
给出你n个小木棒,要求还原成多个长度相同的完整木棒,并求出符合要求的最短的木棒的长度。
经典搜索题。
分析:
这样的题不确定因素很多,所以只能遍历定一个条件,根据这一条件去遍历确定另一条件。另外这题还要剪枝才行,不然会超时。
poj1011#include <cstdio>#include <cstring>#include <cmath>#include <iostream>#include <vector>#include <stack>#include <map>#include <queue>#include <algorithm>using namespace std;#define read freopen("q.in","r",stdin)#define LL long long#define maxn 100#define inf 0x7fffffff#define mod 1000000007int a[maxn];int vis[maxn];int n;bool dfs(int len,int remain,int level)// 需要组成合适的长度还需要的长度 剩下的长度 当前已经完成几根了 { if(remain==0 ) { remain=len;level--; if(level==0)return true; } int i,j; for(i=0;i<n;i++) { if(!vis[i] && a[i]<=remain) { vis[i]=1; if(dfs(len,remain-a[i],level))return true; vis[i]=0; if(remain==a[i] || remain==len)break; while(a[i]==a[i+1] )i++; } } return 0;}bool cmp(int a,int b){ return a>b;}int main(){ while(~scanf("%d",&n)) { int i,j,sum=0,mmax=-1; for(i=0;i<n;i++) { scanf("%d",&a[i]); sum+=a[i]; } sort(a,a+n,cmp); // memset(vis,0,sizeof(vis)); // cout<<" 99999 "<<dfs(sum,sum,1 )<<endl; for(i=a[0];i<=sum;i++) { if(sum%i==0) { memset(vis,0,sizeof(vis)); if(dfs(i,i,sum/i)) { cout<<i<<endl; break; } } } }}
0 0
- poj1011 搜索
- poj1011 搜索
- [搜索]poj1011
- poj1011(搜索应用)
- poj1011 Sticks 搜索
- poj1011 Sticks(搜索+剪枝)
- poj1011 Sticks(搜索剪枝)
- HDU1455 POJ1011 Sticks 搜索
- 【DFS搜索】poj1011 Sticks
- poj1011 _经典搜索
- POJ1011 搜索+剪枝【很好】
- 搜索算法(poj1011)
- poj1011 stick 强力搜索剪枝
- [搜索] ZOJ1002、ZOJ1008、ZOJ1019、POJ1011
- poj1011 stick(搜索,剪枝)
- 【poj1011】Sticks 搜索与剪枝
- POJ1011
- POJ1011
- 线性(一般性)拟合最小二乘解(超定方程)
- ubuntu 12.04 安装 Cloudera Manager5及CDH5(Mysql)【添加yum源方式安装集群】
- Sentry Robots
- Codeforces Round #249 (Div. 2) (模拟)
- 重建二叉树
- [搜索]poj1011
- oracle创建存储函数:查询某个员工的年收入
- POJ 2828 Buy Tickets(线段树)
- Hibernate的generator属性的意义
- lintcode Interval Sum
- Java的数据类型和运算符
- 实现自己的类加载时,重写方法loadClass与findClass的区别
- 就快结束了
- Java基础---if语句,while语句,for语句