这题的话,我们,定义一个结构体,然后把木棒从大到小排序。

这些木棒如果是由多根等长木棒组成的,那目标长度一定大于等于其中最长的木棒长度,所这就是我们搜索的下限。

上限就是所有的木棒组成了一根木棒,就是所有木棒长度的总和,确定了搜索范围之后,我们再来确定搜索的边界。

其实搜索的边界很明显,就是当拼接而成的木棒根数跟我们期望的目标根数相同的时候,这时候,说明我们的假设就是正确的。

至于其它的,就在代码中注释了。

#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-木棒的更多相关文章

  1. hdu 1455 Sticks

    Sticks Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  2. hdu 1455 N个短木棒 拼成长度相等的几根长木棒 (DFS)

    N根短木棒 能够拼成几根长度相等的长木棒 求长木棒的长度 如果答案不止一种 输出最小的 Sample Input95 2 1 5 2 1 5 2 141 2 3 40 Sample Output65 ...

  3. hdu 1455 Sticks(dfs+剪枝)

    题目大意: George有许多长度相同的木棍,随机的将这些木棍砍成小木条,每个小木条的长度都是整数单位(长度区间[1, 50]).现在George又想把这些小木棒拼接成原始的状态,但是他忘记了原来他有 ...

  4. uva 215 hdu 1455 uvalive5522 poj 1011 sticks

    //这题又折腾了两天 心好累 //poj.hdu数据极弱,找虐请上uvalive 题意:给出n个数,将其分为任意份,每份里的数字和为同一个值.求每份里数字和可能的最小值. 解法:dfs+剪枝 1.按降 ...

  5. Sticks HDU - 1455 (未完成)

    George took sticks of the same length and cut them randomly until all parts became at most 50 units ...

  6. HDU 1455 http://acm.hdu.edu.cn/showproblem.php?pid=1455

    #include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> #de ...

  7. HDU 1455 Sticks(经典剪枝)

    Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  8. Hdu 1455

    #include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> ...

  9. hdu 1455(DFS+好题+经典)

    Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  10. hdu 1258 Sum It Up(dfs+去重)

    题目大意: 给你一个总和(total)和一列(list)整数,共n个整数,要求用这些整数相加,使相加的结果等于total,找出所有不相同的拼凑方法. 例如,total = 4,n = 6,list = ...

随机推荐

  1. struts工作原理

    在struts2的应用中,从用户请求到服务器返回相应响应给用户端的过程中,包含了许多组件如:Controller.ActionProxy.ActionMapping.Configuration Man ...

  2. 63. 不同路径 II

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). 现在考虑网 ...

  3. OSPF-1-OSPF的数据库交换(4)

    4.DD交换:主/从关系   当两台路由器之间形成了邻居关系后(ExStart),邻居双方需要决定在数据库交换的过程中,哪台路由器的角色是主,哪台路由器的角色是从.主和从这两个角色决定了DD包交换过程 ...

  4. [软件工程基础]2017.10.30 第三次 Scrum 会议

    决议 游心与李煦通沟通生成报告脚本问题,并调试相应代码 李煦通部署服务器,并做一定安全检查 石奇川设计实验流程和题库前端页面 王嘉睿爵测试网站基本流程,提出关于用户体验方面的建议 刘子渊阅读代码,为机 ...

  5. Linux上的常用命令(含在Linux上部署springboot工程所要用到的命令)

    日常使用命令: 开关机:(shutdown命令的时间参数似乎是一定要的) shutdown -h now ——h的意思就是服务停掉之后立即关系,shutdown命令的时间参数是必须要的,now相当于是 ...

  6. jsp第一章 动态网页开发基础

    动态网站可以实现交互功能,如用户注册.信息发布.产品展示.订单管理等等: 动态网页并不是独立存在于服务器的网页文件,而是浏览器发出请求时才反馈网页: 动态网页中包含有服务器端脚本,所以页面文件名常以a ...

  7. 一步步实现自己的ORM(五)

    上一张优化了ORM的INSERT.UPDATE.DELETE,但将数据库里的值填充到实体类这块还没优化.另外有博友在网上咨询说你这个都是查询所有字段的,而他的需求是按需查询字段,不是一次性取出来所有字 ...

  8. Flask 学习系列(二)---Jinjia2模板

    下面是一个jinjia2的简单模板的例子: <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  9. codeforces736D. Permutations(线性代数)

    题意 $m \leqslant 500000$,题目打错了 Sol 神仙题Orz 构造矩阵$B$,使得$B[b[i]][a[i]] = 1$ 那么他的行列式的奇偶性也就对应了生成排列数列数量的奇偶性( ...

  10. Ubuntu16.04 + cuda8.0 + GTX1080安装教程

    1. 安装Ubuntu16.04 不考虑双系统,直接安装 Ubuntu16.04,从 ubuntu官方 下载64位版本: ubuntu-16.04-desktop-amd64.iso . 在MAC下制 ...