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. JAVA面向对象思想理解分析

    1.面向对象是面向过程而言.两者都是一种思想.面向过程:强调的是功能行为.(强调过程.动作)面向对象:将功能封装进对象,强调了具备了功能的对象.(强调对象.事物)面向对象是基于面向过程的.将复杂的事情 ...

  2. 分布式网上商城项目-dubbo搭建与初次使用错误

    1.Spring-service启动失败 严重: Exception sending context initialized event to listener instance of class o ...

  3. Python——判断

    if语句简介 说明 使用if语句判断的条件表达式的结果只有两种:Ture和False,结果为True则执行if语句中的代码,否则不执行,例: name = "smith" if n ...

  4. AES加密工具

    public class AES { /** * 加密 * * @param content * 需要加密的内容 * @param password * 加密密码 * @return */ publi ...

  5. nginx 只允许域名访问,禁止IP访问

    在nginx中为了防止,通过ip地址或者没有备案的域名代理到nginx上,可以在nginx中配置来阻止这一操作 #只可以用域名访问(此处的server是新增,并不是在原有的server基础上修改),默 ...

  6. js中split()和join()的用法

    Split()方法:把一个字符串分割成字符串数组 如上所示:把字符串a按空格分隔,得3个字符串数组. 在如: var  a=”hao are you”  a.split(“”);  得到[h,a,o, ...

  7. Jackson 触发的String.intern() bug, 导致内存持续增加,JVM-Java内存泄漏

    我在本地用Jackson可以复现这个问题了. import java.io.IOException; import java.util.Map; import java.util.Random; im ...

  8. 阿里云mysql连接不上

    轻量级服务器管理 - 防火墙 - 添加规则 防火墙 mysql 3306 注意IPtables 与 firewalld 状态! 啃爹的防火墙,找了一天

  9. Redis Handle

    package com.jn.baseservice.utils; import com.jn.baseservice.GlobalEntiy.Entity; import com.google.gs ...

  10. 牛客暑假多校第五场A.gpa

    一.题意 给出你的N门课程的考试成绩和所占的机电数目.允许你放弃K门课的成绩,要求你的平均学分绩最高能达到多少. Kanade selected n courses in the university ...