D - 小木棒

Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others)

Problem Description

George有一些长度相等的木棒,他随意的将这些木棒切成长度最多是50的小木棒。麻烦来了,他现在想将这些杂乱的小木棒恢复到原来的木棒,但是他忘记了原来到木棒的数量和长度。请你帮助他设计一个程序计算出原来木棒可能的最小长度,所有小木棒的长度均表示为大于0的整数。

Input

每组输入数据包括两行。第一行是George切后小木棒的个数,最多有64根小木棒;第二行是这些小木棒的长度,这些长度表示为空格分开的整数。输入样例以整数0表示结束。

Output

输出一行,即为原始木棒可能的最小长度。

Sample Input

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

Sample Output

6
5

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std; int a[], n, now;
bool vis[]; bool dfs(int len, int cnt, int p){ //当前需要的木棍长度,当前已拼接的木棍个数,当前拼接的下标 if(cnt == n) return true; //已经拼成了n个木棍,可行
if(len == ) { //当前需要的木棍长度为0
len = now; //把len置为当前检测长度 now
p = n; //把搜索下标置为最大
} int lst = ;
for(int i=p-; i>=; i--){ //剪枝:再同一根木棍的拼凑中,不用反复搜索较大木棍,[0, p]
if(!vis[i] && a[i] <= len && a[i] != lst){ //剪枝:如果和上一个不可行长度相等,则跳过
vis[i] = true; // 取当前木棍 再搜索
if(dfs(len - a[i], cnt + , i)) // 可行 return true
return true;
vis[i] = false; // 不可行,则需要回退状态,不选当前木棍
lst = a[i]; // 记录上一个不可行的木棍,和这个相等的都不用判
if(len == now) return false; // 剪枝: 如果有任何一个不能构成len长度,则return false
}
}
return false;
} int main(){
int maxx, sum, ans; // 分别记录最长的木棍,总长度,答案
while(~scanf("%d", &n) && n){
sum = ;
for(int i=; i<n; i++) {
scanf("%d", &a[i]);
sum += a[i];
}
sort(a, a+n); //sort 默认升序排序
maxx = a[n-]; //取最大的元素
ans = sum; //ans初始化为sum,如果[maxx, sum/2]范围内都找不到解,一定是全部合成一根 for(int i=maxx; i<=sum/; i++){ //剪枝:如果[maxx, sum/2]范围内都找不到解,答案是sum
if(sum%i == ) { //剪枝:当i是sum的因子,才有可能是原木棍长度
memset(vis, , sizeof vis); //每次搜索前,把所有木棍置为未选择状态
now = i; //当前搜索的目标长度是i if(dfs(i, , n)) {
ans = i; //剪枝:找到的第一组可行解直接跳出
break;
}
}
}
printf("%d\n", ans);
}
return ;
}

D - 小木棒的更多相关文章

  1. 小木棒HDU1455(DFS+剪枝)

    题意:HDU1455 给出n个小木棒的长度,他们是又数根长度相同的木棒剪短得来的,问没剪短之前的木棒长度最短是多少. 思路: 见代码:https://www.cnblogs.com/fqfzs/p/9 ...

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

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

  3. 洛谷—— P1120 小木棍 [数据加强版]

    https://www.luogu.org/problem/show?pid=1120 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接 ...

  4. P1120/UVA307 小木棍(sticks) 题解

    题目描述 pdf 题解 注意的问题是,各个原始木棒的长度都是一样的! 说一下本题的总思路即:DFS+超强力剪枝!(详见本人的 AC 程序) 首先,我们要从小到大枚举原始木棒的长度len,也就是枚举答案 ...

  5. 洛谷P1120 小木棍 (搜索+剪枝)

    搜索的经典题. 我们要求木根的最小长度,就要是木根的数量尽可能多,可以发现木根的长度一定可以整除所有小木棒的总长度,从小到大枚举这个可能的长度,第一次有解的就是答案. 关心的状态:当前正在拼哪根木棍, ...

  6. Codeforces 721E Road to Home

    题意 输入第一行有4个数,分别为\(L,n,p,t\),分别表示总长度为\(L\)的路,中间有\(n\)个互不相交的区间,现在要用长度为\(p\)的小木棒从左往右铺路(木棒不能被折断,也不能有重叠,且 ...

  7. hdu 1455 Sticks(dfs+剪枝)

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

  8. hdu 5543 Pick The Sticks(动态规划)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5543 题意:给你一根长为m的长木板和一些小木棒,每一根小木棒有它的长度和价值,这些小木棒要放在长木板上 ...

  9. UESTC_吴队长征婚 2015 UESTC Training for Search Algorithm & String<Problem E>

    E - 吴队长征婚 Time Limit: 10000/4000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

随机推荐

  1. OCCI开发环境搭建(Ubuntu)

    OCCI开放包(下载与服务器版本相同的开发包, 这用的是12.1.0.2): instantclient-basic-linux.x64-12.1.0.2.0.zip instantclient-sd ...

  2. mysql的数据操作和内置功能总结

    一.数据的增删改查 1.插入数据 a.插入完整数据(顺序插入) INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n); INSERT INTO 表名 ...

  3. JDBC与Statement和PreparedStatement的区别

    一.先来说说,什么是java中的Statement:Statement是java执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句.具体步骤: 1.首先导入 ...

  4. Oracle数据库远程访问

    如果需要访问非本机的Oracle数据库,首先需要安装一个Oracle的客户端,我直接安装的服务器版本的Oracle,也自带客户端. 安装完成后,如果访问本机的服务器的话,直接就可以访问,无需配置, 如 ...

  5. python多线程举例

    Python中使用线程有两种方式:函数或者用类来包装线程对象. 1.  函数式:调用thread模块中的start_new_thread()函数来产生新线程.如下例: import time      ...

  6. Nodejs 使用 addons 调用c++ 初体验(一)

    纠结很久,决定写一点遇到的“坑”. 基础环境:win7-64bit  node(v7.5.0)   这些安装实在是太方便了,自行准备吧. 1. 安装 python(2.7.x ),用npm安装 nod ...

  7. 九、IIC驱动原理分析

    学习目标:学习IIC驱动原理: 一.IIC总线协议 IIC串行总线包括一条数据线(SDA)和一条时钟线(SCL),支持“一主多从”和“多主机”模式:每个从机设备都有唯一的地址来识别. 图 1 IIC ...

  8. phpcms2008网站漏洞如何修复 远程代码写入缓存漏洞利用

    SINE安全公司在对phpcms2008网站代码进行安全检测与审计的时候发现该phpcms存在远程代码写入缓存文件的一个SQL注入漏洞,该phpcms漏洞危害较大,可以导致网站被黑,以及服务器遭受黑客 ...

  9. count_char

    import java.util.Scanner; public class count_char { public static void main(String args[]) { int cou ...

  10. debounce、throttle、requestAnimationFrame

    今天review同事代码,代码实现了返回顶部的功能,用到了lodash库中的throttle,我看着眼生,于是乎去看了下lodash文档,然后牵出了debounce,具体的知识点,这里不再赘述,底部的 ...