【题意描述】

George用相同的长度棍子,将他们随机切成最多64个单位的长度,现在,他想回到原来的状态,但他忘了他原来的多少根,以及他们原本是多长。请帮助他和设计一个程序,计算最小的可能的原始长度。所有长度均大于零的整数。

【输入】

输入包含2行的块。第一行:切成多少根,最多有64根。第二行切成的每一根的长度。文件的最后一行包含零,表示结束。

【输出】

输出每行应包含原始棒的最小可能长度。

【输入样例】

9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0

【输出样例】

6
5 附源文件如下:
 #include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int Max = ; int n, len, stick[Max];
bool flag, vis[Max]; bool cmp(int a, int b) //排序从大到小的比较函数
{
return a > b;
} void dfs(int dep, int now_len, int u)
{
if(flag) return;
if(now_len == ) //目前长度为0,也就是说重新开始
{
int k = ;
while(vis[k]) k ++;
vis[k] = true;
dfs(dep + , stick[k], k + );
vis[k] = false;
return;
}
if(now_len == len)
{ // 当前长度为len,即又拼凑成了一根原棒
if(dep == n) flag = true; // 完成的标志:所有的n根小棒都有拼到了
else dfs(dep, , );
return;
}
for(int i = u; i < n; i ++)
if(!vis[i] && now_len + stick[i] <= len)
{
if(!vis[i-] && stick[i] == stick[i-]) continue; // 不重复搜索:最重要的剪枝
vis[i] = true;
dfs(dep + , now_len + stick[i], i + );
vis[i] = false;
}
} int main()
{
freopen("p.in","r",stdin);
freopen("p.out","w",stdout);
while(scanf("%d", &n) && n != )
{
int sum = ;
flag = false;
for(int i = ; i < n; i ++)
{
scanf("%d", &stick[i]);
sum += stick[i];
}
sort(stick, stick + n, cmp); // 从大到小排序 for(len = stick[]; len < sum; len ++)
if(sum % len == )
{ // 枚举能被sum整除的长度
memset(vis, , sizeof(vis)); //注意只能在这里进行初始化
dfs(, , );
if(flag) break;
}
printf("%d\n", len);
}
return ;
}

棍子Sticks(poj_1011)[经典搜索]的更多相关文章

  1. POJ 1011:Sticks 经典搜索

    Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 128734   Accepted: 30173 Descrip ...

  2. hdu1495之经典搜索

    非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  3. hdu 1043(经典搜索)

    题意: 给你一个初始的图,然后每次输入一个图,要求移动x最小的步数达到和初始图一样,输出路径 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 5 6 7 8 5 6 7 8 5 6 7 ...

  4. poj(1011)——Sticks(经典的dfs+剪枝)

    题目的大致意思是: 如今有n根木棍,然后须要把它们拼成相同长度的木棍,问满足这个条件的最短的长度是多少? 想法嘛:那肯定是dfs把长度搜一遍就好,但问题的关键是这里会超时.那么就要用到剪枝的原理了. ...

  5. HDU 2102 A计划 经典搜索

    A计划 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissio ...

  6. (中等) HDU 1043 Eight,经典搜索问题。

    Problem Description The 15-puzzle has been around for over 100 years; even if you don't know it by t ...

  7. uva 1601 poj 3523 Morning after holloween 万圣节后的早晨 (经典搜索,双向bfs+预处理优化+状态压缩位运算)

    这题数据大容易TLE 优化:预处理, 可以先枚举出5^3的状态然后判断合不合法,但是由于题目说了有很多墙壁,实际上没有那么多要转移的状态那么可以把底图抽出来,然后3个ghost在上面跑到时候就不必判断 ...

  8. (C++一本通)最少转弯问题 (经典搜索)

    题目描述 给出一张地图,这张地图被分为n×m(n,m<=100)个方块,任何一个方块不是平地就是高山.平地可以通过,高山则不能.现在你处在地图的(x1,y1)这块平地,问:你至少需要拐几个弯才能 ...

  9. 【poj1011】 Sticks

    http://poj.org/problem?id=1011 (题目链接) 题意 给出一大堆小棍子的长度,需要把他们拼成几根长度相等的大棍子,求大棍子的最短长度. Solution 经典搜索题,剪枝剪 ...

随机推荐

  1. 第三十篇 玩转数据结构——字典树(Trie)

          1.. Trie通常被称为"字典树"或"前缀树" Trie的形象化描述如下图: Trie的优势和适用场景 2.. 实现Trie 实现Trie的业务无 ...

  2. Java-POJ1003-Hangover

    题目大意: 给出一个浮点数a,求出使得 不等式 1/2 + 1/3 + ... + 1/(n+1) ≥ a 成立的最小值 大水题,由于数据范围小,给出了确认上界5.20,满足二分答案 但是我懒啊,直接 ...

  3. 1.EntityManaget的persist和merge方法的区别

    1.persist和merge的区别: Persist:添加 Merge : 分两种情况,当对象存在id,则修改:当对象不存在id则添加. 看个例子: 1 public class Account { ...

  4. LTE引理——解决数论竞赛题的利器

    LTE (Lifting The Exponent Lemma)引理是一个解指数型不定方程的强力工具.它在Olympiad folklore非常知名,虽然它的起源已经无从查找了.它和Hensel’s ...

  5. 关于BaiduPSC-Go的一些bug的更正

    首先说下操作步骤 下载是在GutHub,这个不赘述,网上很多资料 下载之后配置环境变量,在path的后面加上一个分号,然后加上你下载的目录,目录名最好为英文 然后通过命令行CMD工具,输入BaiduP ...

  6. Mongo查询list数组中一个字段大于特定条数

    由于刚刚接触mongodb,很多语法还不是很了解,写的不好的地方请大佬指出 查询的demo数据 { "_id":Object("xxxxxxxx"), &quo ...

  7. 在手机浏览器中判断App是否已安装

    从网上搜到之前手机中判断App是否安装可以通过onblur事件+定时器来实现. 但现在要做这个功能时,按网上的说法已经不能实现了.因为现在浏览器中打开App,window不会触发onblur事件. 在 ...

  8. Hibernate知识点整理

    一, Hibernate 介绍: Hibernate 只是一个将持久化类与数据库表相映射的工具,每个持久化类实例均对应于数据库表中的一个数据行而已.用户只需直接使用面向对象的方法操作此持久化类实例,即 ...

  9. zk zkCli shell命令

    查看zk 注册服务:在zk bin 下执行 sh zkCli.sh 计入客户端shell命令行 查看zk注册服务:ls  /  或者递归查看 ls  -s  /      列出的为注册服务. 查询服务 ...

  10. [Java] 多线程基础详细总结,附加详细实例

    详细代码在文章底部 目录 基础概念 进程与线程 单线程与多线程 实现线程的4中方式 thread.start()和runnable.run()的区别 Thread和Runnable的异同 线程的基本操 ...