//这题又折腾了两天 心好累

//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的更多相关文章

  1. DFS(剪枝) POJ 1011 Sticks

    题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...

  2. POJ 1011 - Sticks DFS+剪枝

    POJ 1011 - Sticks 题意:    一把等长的木段被随机砍成 n 条小木条    已知他们各自的长度,问原来这些木段可能的最小长度是多少 分析:    1. 该长度必能被总长整除    ...

  3. 搜索+剪枝——POJ 1011 Sticks

    搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ...

  4. poj 1011 Sticks

    Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 126238   Accepted: 29477 Descrip ...

  5. OpenJudge 2817:木棒 / Poj 1011 Sticks

    1.链接地址: http://bailian.openjudge.cn/practice/2817/ http://poj.org/problem?id=1011 2.题目: 总时间限制: 1000m ...

  6. POJ 1011 Sticks 【DFS 剪枝】

    题目链接:http://poj.org/problem?id=1011 Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissio ...

  7. poj 1011 Sticks (DFS+剪枝)

    Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 127771   Accepted: 29926 Descrip ...

  8. POJ 1011 Sticks dfs,剪枝 难度:2

    http://poj.org/problem?id=1011 要把所给的集合分成几个集合,每个集合相加之和ans相等,且ans最小,因为这个和ans只在[1,64*50]内,所以可以用dfs一试 首先 ...

  9. POJ 1011 Sticks(dfs+剪枝)

    http://poj.org/problem?id=1011 题意:若干个相同长度的棍子被剪成若干长度的小棍,求每根棍子原来的可能最小长度. 思路:很经典的搜索题. 我一开始各种超时,这题需要很多剪枝 ...

随机推荐

  1. django随笔说明

    最近学习了vamei的快速Python教程,想着语法学了不用就要忘记,总要拿点东西来练练手,然后又开始学习Django,也算是顺势而为吧. 现在学Django,是跟着教程djangobook学的,内容 ...

  2. 关于 <video> 的兼容性测试

    测试浏览器 Firefox: 33.0.1 Chrome: 38.0.2125.111 m Safari: 5.1.7 IE: 9 和 10(6,7,8不考虑) 经测试:FF.Chrome.Safar ...

  3. HTTP 状态代码及其定义

    所有 HTTP 状态代码及其定义. 代码  指示  2xx  成功  200  正常:请求已完成.  201  正常:紧接 POST 命令.  202  正常:已接受用于处理,但处理尚未完成.  20 ...

  4. mysql memcache

    http://blog.csdn.net/newjueqi/article/details/8350643

  5. Buffer Cache(缓冲区缓存)篇:keep缓冲区池(保留池)

    Buffer  Cache可以有三个池 默认缓冲区池 keep缓冲区池 recycling缓冲区池 --保留池和回收池可以独立于sga中的其他缓存分配内存.创建表的时候可以在storage子句中使用b ...

  6. 14.2.3 InnoDB Redo Log

    14.2.3 InnoDB Redo Log 14.2.3.1 Group Commit for Redo Log Flushing redo log 是一个基于磁盘数据结构的用于在crash 恢复正 ...

  7. C++实现线程池 .

    C++实现线程池. 欢迎转载,转载请注明原出处:http://blog.csdn.net/ithzhang/article/details/9020283 代码地址:https://github.co ...

  8. 微信公众帐号开发。大家是用框架还是自己写的流程。现在遇到若干问题。请教各路大仙 - V2EX

    微信公众帐号开发.大家是用框架还是自己写的流程.现在遇到若干问题.请教各路大仙 - V2EX 微信公众帐号开发.大家是用框架还是自己写的流程.现在遇到若干问题.请教各路大仙

  9. #include <sstream>

    1 std::istringstream 2 std::stringstream 1 std::istringstream input 1 在一个字符串string里提取部分数据,这些数据以空格' ' ...

  10. spring security执行流程图

    今天看到非常多人转载了这篇文章,这里备注一下.原文来自CSDN我的博客. 近期在研究spring security的配置,研究了一个星期了,在官网看了下.仅仅配置出来了简单的登录,但不知如何从数据库读 ...