poj1011 搜索
来源:互联网 发布:网络存储软件有哪些 编辑:程序博客网 时间:2024/06/07 01:54
如题:http://poj.org/problem?id=1011
Description
Input
Output
Sample Input
95 2 1 5 2 1 5 2 141 2 3 40
Sample Output
65
Source
思路:搜索
1.注意可以搜索的拼成后的小木棍的长度的范围, max(a[i]) <=l<=sum(a[i])且sum%i==0
2.3个重要剪枝
1.某根木棒的长度不能构成,则之后的相同长度的也不行
2.如果在构成某根木棒的第一段时最大的无法用上,那么直接不可能
3.如果把某段拿去构成木棒的最后一截后,剩下的无法完成,那么也不可能
3.搜索时用vis数组记录这根小木棍是否已经使用,避免重复使用。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
int a[70];
int vis[70];
int cmp(int x,int y)
{
return x>y;
}
int dfs(int total_len,int left_len,int left_num)
{
if(left_num==0&&left_len==0)
return 1;
if(left_len==0)
left_len=total_len;
int i;
for(i=0;i<n;i++)
{
if(!vis[i])
{
if(left_len>=a[i])
{
vis[i]=1;
if(dfs(total_len,left_len-a[i],left_num-1))
return 1;
vis[i]=0;
if(left_len==total_len||left_len==a[i])
break;
while(a[i]==a[i+1])
i++;
}
}
}
return 0;
}
int main()
{
// freopen("C:\\1.txt","r",stdin);
while(~scanf("%d",&n))
{
if(!n)
break;
int sum=0;
int i;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
sort(a,a+n,cmp);
for(i=a[0];i<=sum;i++)
{
if(sum%i==0)
{
memset(vis,0,sizeof(vis));
if(dfs(i,0,n))
break;
}
}
printf("%d\n",i);
}
}
- 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
- Loadrunner Log Message 打印参数
- 自动人脸识别技术【挑战性问题】
- Direct-Load-apk启动插件的原理
- Spring Security身份认证之HelloSpringSecurity
- 理解GBDT算法(二)——基于残差的版本
- poj1011 搜索
- UVa #12661 Funny Car Racing (例题11-11)
- lineNumber: 1; columnNumber: 1; 前言中不允许有内容。
- 安装mod_proxy_html完善Apache反向代理
- PLS-00428: an INTO clause is expected in this SELECT statement
- IOS应用程序发布到苹果APP STORE
- 怎么装Linux系统?
- 关于解决hibernate左连接关联查询不执行的问题
- Linux netstat命令详解