【题意描述】

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. jdk动态代理底层实现

    一.代理设计模式 代理设计模式是Java常用的设计模式之一. 特点: 01.委托类和代理类有共同的接口或者父类: 02.代理类负责为委托类处理消息,并将消息转发给委托类: 03.委托类和代理类对象通常 ...

  2. Microsoft 常用下载链接

    申明:本文所有下载链接皆来自微软官网,推荐使用迅雷下载 推荐:Windows10安装时选择专业版,Office用2016版,其他随意,具体用哪个版本根据配置和需求 Windows系统下载 Window ...

  3. AcWing 908. 最大不相交区间数量

    //1.将每个区间按右端点从小到大排序 //2.从前往后依次枚举每个区间,如果当前区间中已经包含点,就直接跳过,否则,选择当前区间的右端点 //选右端点的话,可以尽可能的包含在多个区间里 //那么选的 ...

  4. 2.7 Axure rp (快速原型设计工具)

    一.   Axure rp 下载安装 直接百度栏输入Axure rp即可下载.安装无特别处,一直点击下一步即可. 安装的如果是英文版,可以下载汉化包,进行汉化. 汉化参照网址:http://www.a ...

  5. goahead 流程

    原文:https://blog.csdn.net/qq_32419007/article/details/80756643 1.全局变量 Web服务器的根目录 static char_t        ...

  6. DockerToolbox安装docker - Windows 10

    Wiindows安装docker 在转换成linux模式的时候不能使用,只能退而求其次安装Docker ToolBox在windows10中使用docker. 一.前言 由于本机使用的是win10家庭 ...

  7. curl模板----php发送post,get请求

    function _grab($curl,$ip='',$referer='',$postInfo='',$cookie=''){ $ch = curl_init(); curl_setopt($ch ...

  8. Gevent和猴子补丁

    定义 在2018年看Flutent python时了解到猴子补丁,知道咋回事,但是现在通过代码更深刻认识猴子补丁. 猴子补丁:在运行时修改类或模块,而不改动源码. 例子1 没有用猴子补丁 import ...

  9. VIM学习(转)

    原文:http://www.cnblogs.com/nerxious/archive/2012/12/21/2827303.html 断断续续的使用VIM也一年了,会的始终都是那么几个命令,效率极低 ...

  10. hadoop3 配置second name node

    设置hdfs-site.xml <property> <name>dfs.http.address</name> <value>192.168.1.81 ...