棍子Sticks(poj_1011)[经典搜索]
【题意描述】
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)[经典搜索]的更多相关文章
- POJ 1011:Sticks 经典搜索
Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 128734 Accepted: 30173 Descrip ...
- hdu1495之经典搜索
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- 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 ...
- poj(1011)——Sticks(经典的dfs+剪枝)
题目的大致意思是: 如今有n根木棍,然后须要把它们拼成相同长度的木棍,问满足这个条件的最短的长度是多少? 想法嘛:那肯定是dfs把长度搜一遍就好,但问题的关键是这里会超时.那么就要用到剪枝的原理了. ...
- HDU 2102 A计划 经典搜索
A计划 Time Limit : 3000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submissio ...
- (中等) HDU 1043 Eight,经典搜索问题。
Problem Description The 15-puzzle has been around for over 100 years; even if you don't know it by t ...
- uva 1601 poj 3523 Morning after holloween 万圣节后的早晨 (经典搜索,双向bfs+预处理优化+状态压缩位运算)
这题数据大容易TLE 优化:预处理, 可以先枚举出5^3的状态然后判断合不合法,但是由于题目说了有很多墙壁,实际上没有那么多要转移的状态那么可以把底图抽出来,然后3个ghost在上面跑到时候就不必判断 ...
- (C++一本通)最少转弯问题 (经典搜索)
题目描述 给出一张地图,这张地图被分为n×m(n,m<=100)个方块,任何一个方块不是平地就是高山.平地可以通过,高山则不能.现在你处在地图的(x1,y1)这块平地,问:你至少需要拐几个弯才能 ...
- 【poj1011】 Sticks
http://poj.org/problem?id=1011 (题目链接) 题意 给出一大堆小棍子的长度,需要把他们拼成几根长度相等的大棍子,求大棍子的最短长度. Solution 经典搜索题,剪枝剪 ...
随机推荐
- IF EXISTS 两个条件连用
当IF EXISTS要判断多个条件并存时,可以用AND连接,NOT EXISTS同理 IF EXISTS (SELECT 1 ) AND EXISTS (SELECT 2 ) BEGIN ...... ...
- rancher布控集群启动失败
rancher布控集群启动失败 待办 报告缺少某个文件.多线程启动任务部署的时候某些线程跑在前边了, 导致问题出现 解决思路:等待,等待响应的job重启就ok了,都是一些job在跑,失败了会重新开始的 ...
- 钉钉、钉应用(微应用和E应用)开发介绍
钉钉,数字化新工作方式,让工作更简单 目前在钉钉的官网可以看到,超过700万家企业组织正在使用钉钉.笔者也相信,这一数字每天都在增加.获得群众的认可,也是理所当然的,体验过钉钉,就能感觉到,钉钉的考勤 ...
- testng如何实现并发
参考: https://www.cnblogs.com/znicy/p/6534893.html
- js的一些基础
事件对象: 就是用来存储事件相关的信息 事件对象存储信息有: 事件的类别,如:click,keydown等等 点击事件的位置 点击的哪一个键 等等 用于阻止事件流,用于阻止浏览器默认动作(表单提交.a ...
- tomcat、nginx、apache、tengine都是什么,及其作用
Tomcat的功能职责:Tomcat运行在JVM之上,它和HTTP服务器一样,绑定IP地址并监听TCP端口,同时还包含以下指责: • 管理Servlet程序的生命周期• 将URL映射到指定的Ser ...
- bootstrap中响应式表格失灵
当宽度小于768px,由于表格的内容不能填充到出现横向滚动条 单元格内容不够: 出现横向滚动条
- Jquery获取html参数, jquery.params.js 获取参数
================================ ©Copyright 蕃薯耀 2019年12月31日 http://fanshuyao.iteye.com/ /** * 使用:$.q ...
- 第十八篇 Linux环境下常用软件安装和使用指南
提醒:如果之后要安装virtualenvwrapper的话,可以直接跳到安装virtualenvwrapper的方法,而不需要先安装好virtualenv 安装virtualenv和生 ...
- 解决android studio 3.5.3版本的下载安装问题 2.5日
有些好笑,我安装了android studio3.5版本的软件安装了四天,在刚开始的时候,同学们安装软件应该是一趟就下来了,但是我的软件一直卡在了 ERROR: Unable to find vali ...