uva 215 hdu 1455 uvalive5522 poj 1011 sticks
//这题又折腾了两天 心好累
//poj、hdu数据极弱,找虐请上uvalive
题意:给出n个数,将其分为任意份,每份里的数字和为同一个值。求每份里数字和可能的最小值。
解法:dfs+剪枝
1.按降序排序,长的木棍应该优先被使用
2.一个木棍一旦确定就不应当改变,因为新得到的木棍不会更优
3.如果当前循环扫到的第一根木棍加不进去直接return false 因为可以在后面的循环里被搜到
4.如果前一根等长的没有被使用那么不进入循环
5.份数要能整除总长度才会检查是否为合法解
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#include<string> using namespace std; int n;
int crab[];
bool e[];
int MAX,tot_len,want_len; bool cmp(int a,int b){
return a>b;
} bool dfs(int now,int p,int l){
if (now*want_len==tot_len) return true;
for (int i=p;i<n;i++){
if (e[i] && !(i> && e[i-] && crab[i-]==crab[i])){//剪枝4
if (l-crab[i]==){
e[i]=false;
if (dfs(now+,,want_len)) return true;
e[i]=true;
return false;//剪枝2
}
if (l-crab[i]>){
e[i]=false;
if (dfs(now,i+,l-crab[i])) return true;
e[i]=true;
}
if (l==want_len) return false;//剪枝3
}
}
return false;
} int main(){
while (){
scanf("%d",&n);
if (n==) return ;
MAX=;
tot_len=;
for (int i=;i<n;i++){
scanf("%d",&crab[i]);
e[i]=;
tot_len+=crab[i];
MAX=max(MAX,crab[i]);
}
sort(crab,crab+n,cmp);//剪枝1
for (want_len=MAX;want_len<=tot_len;want_len++){
if ((tot_len%want_len==) && dfs(,,want_len)){//剪枝5
printf("%d\n",want_len);
break;
}
}
}
return ;
}
/*
4
4 3 2 1 9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0
*/
uva 215 hdu 1455 uvalive5522 poj 1011 sticks的更多相关文章
- DFS(剪枝) POJ 1011 Sticks
题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...
- POJ 1011 - Sticks DFS+剪枝
POJ 1011 - Sticks 题意: 一把等长的木段被随机砍成 n 条小木条 已知他们各自的长度,问原来这些木段可能的最小长度是多少 分析: 1. 该长度必能被总长整除 ...
- 搜索+剪枝——POJ 1011 Sticks
搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ...
- poj 1011 Sticks
Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 126238 Accepted: 29477 Descrip ...
- OpenJudge 2817:木棒 / Poj 1011 Sticks
1.链接地址: http://bailian.openjudge.cn/practice/2817/ http://poj.org/problem?id=1011 2.题目: 总时间限制: 1000m ...
- POJ 1011 Sticks 【DFS 剪枝】
题目链接:http://poj.org/problem?id=1011 Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissio ...
- poj 1011 Sticks (DFS+剪枝)
Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 127771 Accepted: 29926 Descrip ...
- POJ 1011 Sticks dfs,剪枝 难度:2
http://poj.org/problem?id=1011 要把所给的集合分成几个集合,每个集合相加之和ans相等,且ans最小,因为这个和ans只在[1,64*50]内,所以可以用dfs一试 首先 ...
- POJ 1011 Sticks(dfs+剪枝)
http://poj.org/problem?id=1011 题意:若干个相同长度的棍子被剪成若干长度的小棍,求每根棍子原来的可能最小长度. 思路:很经典的搜索题. 我一开始各种超时,这题需要很多剪枝 ...
随机推荐
- php设计模式之:观察者模式
转载自php面向对象设计模式 之 观察者模式 问题 假如一个小贩, 他把产品的价格提升了, 不同的消费者会对此产生不同的反应.一般的编程模式无非是获取提升的价格,然后获取所有的消费者,再循环每个消费者 ...
- 【转】基于RSA算法实现软件注册码原理初讨
1 前言 目前,商用软件和共享软件绝大部份都是采用注册码授权的方式来保证软件本身不被盗用,以保证自身的利益.尽管很多常用的许多软件系统的某些版本已经被别人破解,但对于软件特殊行业而言,注册码授权的方式 ...
- MYSQL 查看表上索引的 1 方法
前期准备: create table T9(A int ,B text,C text,fulltext index fix_test_for_T8_B(B));#在定义表的时候加索引 create u ...
- 安装 Archlinux 小记
故事的背景 开始的时候装的 win8 + ubuntu 双系统,但是慢慢感觉只要有 windows 存在,在 Linux 上遇到问题了就想逃回去. 在一次 GDG 的演讲中听到的: 趁现在还年轻,还有 ...
- [置顶] 实习总结3-job hunting(西安工作)
开始整理关于西安top level的IT企业的工作从去年开始实习就慢慢展开了,到了北京之后一直关注的比较密切,因此前前后后也整理了很多.本来不打算那么急着写这一篇的,但是在因为在公司呆着,对于西安的一 ...
- docker数据管理2
3. 定义数据卷容器: 只是为了共享数据 docker run -itd -v /data/ --name centeos_testv centos bash /data/ 就是虚拟机内的目录,和宿主 ...
- Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法
Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法 最近由于老师要求要在Ubuntu下QT上进程多线程服务器的开发,虽然只是单纯的调用qt的network模块,但是为了避免麻烦,我 ...
- SP_CreateInsertScript 将表内的数据全部拼接成INSERT字符串输出
),)) as begin set nocount on ) ) ) select @sqlstr='select ''insert '+@tablename select @sqlstr1='' s ...
- poj1484---判断保险丝是否烧断
题目输入要求: 2 2 10 //设备数n 接下来的操作数m 保险丝能承受最大电流c5 //电器1的电流7 //2的电流1 //反转开关12 //反转开关2 思路:设置一个flag数组,记得每次 ...
- const和define的区别
1.在使用const定义常量时,只能使用标量初始化; 但我们可以使用任何表达式初始化define定义的常量 2.我们可以在条件表达式中使用define定义常量,但绝对不能使用const eg: def ...