HDU-1455-木棒
这题的话,我们,定义一个结构体,然后把木棒从大到小排序。
这些木棒如果是由多根等长木棒组成的,那目标长度一定大于等于其中最长的木棒长度,所这就是我们搜索的下限。
上限就是所有的木棒组成了一根木棒,就是所有木棒长度的总和,确定了搜索范围之后,我们再来确定搜索的边界。
其实搜索的边界很明显,就是当拼接而成的木棒根数跟我们期望的目标根数相同的时候,这时候,说明我们的假设就是正确的。
至于其它的,就在代码中注释了。
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
struct Stick {
int len, mark;
bool operator < (const Stick &s)const {
return len > s.len;
}
}stick[100];
int total, l;
int n, sum;
//s已经组成的木棒根数,len正在拼接中的木棒长度,pos位置
int DFS(int s,int len,int pos)
{
if (s==total)
return 1;
for (int i = pos + 1; i < n;i++) {
if (stick[i].mark)
continue;
if (stick[i].len+len==l) {
stick[i].mark = 1;
if (DFS(s+1,0,-1))
return 1;
stick[i].mark = 0;
return 0;//如果其中一根无法和其它的任一根拼接,我们就放弃这个长度
}
else if (stick[i].len+len<l) {
stick[i].mark = 1;
if (DFS(s,len+stick[i].len,i))//我们找的是按序排列的木棍中的下一根进行尝试
return 1;
stick[i].mark = 0;//对于main函数中的for循环起效,因为还要搜索其它的长度
if (len==0)
return 0;//如果第一层中的第一根无法和其它任一根拼接,我们也放弃这个长度
while (stick[i].len==stick[i+1].len)
i++;//对于要进行深搜之前,我们不在搜索相同的长度,此为剪枝
}
}
return 0;
}
int main()
{
while (scanf("%d",&n)&&n) {
sum = 0;
for (int i = 0; i < n;i++) {
scanf("%d", &stick[i].len);
sum += stick[i].len;
stick[i].mark = 0;
}
sort(stick, stick + n);
for (l = stick[0].len; l <= sum ;l++) {
if (sum%l!=0)
continue;
total = sum / l;
if (DFS(0,0,-1)) {//取长度最长的木棒作为深搜的开始
//搜的时候,已经组成的木棒为0,已经组成的长度为0,下标保证从0开始
printf("%d\n", l);
break;
}
}
}
return 0;
}
HDU-1455-木棒的更多相关文章
- hdu 1455 Sticks
Sticks Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- hdu 1455 N个短木棒 拼成长度相等的几根长木棒 (DFS)
N根短木棒 能够拼成几根长度相等的长木棒 求长木棒的长度 如果答案不止一种 输出最小的 Sample Input95 2 1 5 2 1 5 2 141 2 3 40 Sample Output65 ...
- hdu 1455 Sticks(dfs+剪枝)
题目大意: George有许多长度相同的木棍,随机的将这些木棍砍成小木条,每个小木条的长度都是整数单位(长度区间[1, 50]).现在George又想把这些小木棒拼接成原始的状态,但是他忘记了原来他有 ...
- uva 215 hdu 1455 uvalive5522 poj 1011 sticks
//这题又折腾了两天 心好累 //poj.hdu数据极弱,找虐请上uvalive 题意:给出n个数,将其分为任意份,每份里的数字和为同一个值.求每份里数字和可能的最小值. 解法:dfs+剪枝 1.按降 ...
- Sticks HDU - 1455 (未完成)
George took sticks of the same length and cut them randomly until all parts became at most 50 units ...
- HDU 1455 http://acm.hdu.edu.cn/showproblem.php?pid=1455
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> #de ...
- HDU 1455 Sticks(经典剪枝)
Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- Hdu 1455
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> ...
- hdu 1455(DFS+好题+经典)
Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- hdu 1258 Sum It Up(dfs+去重)
题目大意: 给你一个总和(total)和一列(list)整数,共n个整数,要求用这些整数相加,使相加的结果等于total,找出所有不相同的拼凑方法. 例如,total = 4,n = 6,list = ...
随机推荐
- 解决IIS中运行TopJUI左侧菜单不显示的问题
TopJUI演示系统中,模拟数据保存在.json文件中,目前发现有部分用户的IIS容器默认情况下是不支持.json文件的请求的,因此需要配置一下,可参考下文配置解决: 一.IIS 6 1. MIME设 ...
- Django (十) 项目部署 1
阿里云部署项目 1, 购买阿里云ECS云服务器(可免费试用1个月) 2, 阿里云实例更换为Ubuntu 3, 安全组配置 4, xshell远程连接 5, 创建虚拟环境: 5.1 linux基本命令 ...
- 使用PHP操作SQL 完成简单的CURD操作
1.从数据库出发,先建立测试数据,这里使用的MYSQL,通过脚本模式创建测试数据. SET NAMES UTF8; DROP DATABASE IF EXISTS disk; CREATE DATAB ...
- SecureCRT无法连接虚拟机Linux—虚拟网卡(NAT方式)IP(169.254.xx.xx)无效问题
搞了一晚上,终于解决了http://blog.csdn.net/zengxianyang/article/details/50394809
- JavaScriptSerializer类序列化日期时需要注意的问题
1.让我们来看看使用JavaScriptSerializer类序列化日期会出现什么问题? 1)创建用于序列化的测试类,如下: public class Person { public int ID { ...
- LVDT
什么是 LVDT? LVDT 是线性可变差动变压器的缩写. 它是一种常见类型的机电传感器,可将其以机械方式耦合的物体的直线运动转换为对应的电气信号.LVDT 线性位移传感器随时可用,可以测量各种移动, ...
- Jquery EasyUI 中ValidateBox验证框使用讲解(转)
Validatebox(验证框)的设计目的是为了验证输入的表单字段是否有效.如果用户输入了无效的值,它将会更改输入框的背景颜色,并且显示警告图标和提示信息.该验证框可以结合form(表单)插件并防止表 ...
- apache关联php
LoadModule php5_module "D:/softs/php/php5apache2_2.dll" AddType application/x-httpd-php .p ...
- cookie和session基础以及在Django中应用
看了会视频,终于搞懂了~ 1.cookie cookie:保存状态 cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地:当浏览器再次访问时,浏览器会自动带上cookie,这样服务器 ...
- promise从易到难
Chapter 1 // 需求:你要封装一个方法,我给你一个要读取文件的路径,你这个方法能帮我读取文件,并把内容返回给我 const fs = require('fs') const path = r ...