题目描述

乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位。

然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。

请你设计一个程序,帮助乔治计算木棒的可能最小长度。

每一节木棍的长度都用大于零的整数表示。

输入格式
输入包含多组数据,每组数据包括两行。

第一行是一个不超过64的整数,表示砍断之后共有多少节木棍。

第二行是截断以后,所得到的各节木棍的长度。

在最后一组数据之后,是一个零。

输出格式
为每组数据,分别输出原始木棒的可能最小长度,每组数据占一行。

题目分析

首先,看到最小,一定会想到二分,然后,用dfs为check函数,进一步,我们就要找到l,r,r明显是所有的值,但是l是什么,于是,只能暴力跑来,终点应该是和,而起点应该是1,但是,<最大的值的i,肯定是不行的,于是,起点可以改为最大值

dfs部分也很简单,设立一个当前值,如果>枚举的长度,就说明一定不行,一直到最后,如果没有return 0,就可以return 1,这样的时间复杂度为n!*n,64!一定会超时间,于是,便需要剪枝

题目要求,每个木棍如果超50不会进入计算

1,为了早点判断出是否可行,我们可以从大到小排个序,如果不行,return 0就能早一点,就像把一瓶一瓶的水放进水桶,水越多,越早溢出
2.如果,这根小木棍无法成功,说明,这个长度的小木棍都不行,有点记忆化的感觉
3.如果当前的木棍长度为零,且无法再次拼接,那就说明,肯定不行,如果一根小木棍不行,那莫,在剩余的木棍中,这个小木棍都是不行的,
4.如果,当前木棍无法拼接,且正好填满,说明,后面的都不行,贪心易证

#include <bits/stdc++.h>
using namespace std;
int n;
int cnt=0;
struct edge {
int val;
} a[10005];
int gs;
int x;
bool cmp(edge x, edge y) { return x.val > y.val; }
int vis[10005];
bool dfs(int x, int cd, int sg, int zz) {
if (x == gs+1) {
return 1;
}
if (cd == zz) {
return dfs(x + 1, 0, 1, zz);
}
int pd = 0;
for (int i = sg; i <= cnt; i++) {//不能是n
if (pd == a[i].val) {
continue;
}
if (vis[i]) {
continue;
}
if (cd + a[i].val > zz) {
continue;
}
vis[i] = 1;
if (dfs(x, cd + a[i].val, i + 1, zz)) {
return 1;
}
vis[i] = 0;
pd = a[i].val;
if (cd == 0 || cd + a[i].val == zz) {
return 0;
}
}
return 0;
}
int main() {
while (~scanf("%d", &n)) {
if (n == 0) {
return 0;
}
int sum = 0;
cnt=0;
for (int i = 1; i <= n; i++) {
scanf("%d", &x);
if(x>50)
{
continue;
}
a[++cnt].val=x;
sum += a[cnt].val;//易错
}
sort(a + 1, a + 1 + cnt, cmp);
for (int i = a[1].val; i <= sum; i++) {
if (sum % i == 0) {
gs = sum / i;
memset(vis, 0, sizeof(vis));
if (dfs(1, 0, 1, i)) {
printf("%d\n", i);
break;
}
}
}
}
}

木棒poj1011的更多相关文章

  1. POJ1011 木棒(dfs+剪枝)

    问题重述: Description乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始 ...

  2. poj1011 Sticks[剪枝题]

    https://vjudge.net/problem/POJ-1011 此题很重要.★★★ 很欢(e)乐(xin)的一道搜索剪枝题..poj数据还是太水了,我后来想不出来剪枝方法了,就加了句掐了时间语 ...

  3. poj1011 Sticks (搜索经典好题)

    poj1011 Sticks 题目连接: poj1011 Description George took sticks of the same length and cut them randomly ...

  4. 北大poj-1011

    木棒 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 136132   Accepted: 32036 Description ...

  5. 【poj1011】 Sticks

    http://poj.org/problem?id=1011 (题目链接) 题意 给出一大堆小棍子的长度,需要把他们拼成几根长度相等的大棍子,求大棍子的最短长度. Solution 经典搜索题,剪枝剪 ...

  6. POJ1011

    今天搞了一下传说中的经典搜索题——poj1011,果然里面充斥着各种巧妙的剪枝,做完之后回味一下还是感觉构思太巧妙,所以总结记录一下加深理解. 原题:http://poj.org/problem?id ...

  7. POJ1011 Sticks

    Description George took sticks of the same length and cut them randomly until all parts became at mo ...

  8. POJ1011 (DFS+剪枝)

    Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 129606   Accepted: 30388 Descrip ...

  9. Sticks(poj1011/uva307)

    题目大意: 乔治有一些碎木棒,是通过将一些相等长度的原始木棒折断得到的,给出碎木棒的总数和各自的长度,求最小的可能的原始木棒的长度:(就是将一些正整数分组,每组加起来和相等,使和尽可能小) 一开始做p ...

随机推荐

  1. Linux_spool命令

    spool的作用是什么? spool的作用可以用一句话来描述:在sqlplus中用来保存或打印查询结果. 参数指南 对于SPOOL数据的SQL,最好要自己定义格式,以方便程序直接导入,SQL语句如: ...

  2. 【Java基础】JAVA中优先队列详解

    总体介绍 优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素).这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序( ...

  3. 【Java多线程】ExecutorService和ThreadPoolExecutor

    ExecutorService Java.util.concurrent.ExecutorService接口代表一种异步执行机制,它能够在后台执行任务.因此ExecutorService与thread ...

  4. 设计模式和java实现

    三种工厂模式:https://www.cnblogs.com/toutou/p/4899388.html 适配器模式:https://www.cnblogs.com/V1haoge/p/6479118 ...

  5. 【笔记】草履虫也能看懂的ELK搭建流程

    环境需要 Elasticsearch需要JAVA环境,至少是JDK1.8 elasticsearch 不允许root用户使用,需要新增个elk用户 如果觉得官网下载太慢,可以使用这个 https:// ...

  6. JSP九大内置对象及四个作用域详解

    一共有九大内置对象: request.response.out.session.application.pageContext.page.config.exception 内置对象(又叫隐含对象),就 ...

  7. C++STL标准库学习笔记(五)set

    前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标记了出来,这一篇后面主要都是我的记录了,为了防止大片蓝色字体出现,后面就不改蓝色 ...

  8. 你的Redis怎么持久化的

    一.持久化套路 OK,一般我们在生产上采用的持久化策略为 (1)master关闭持久化 (2)slave开RDB即可,必要的时候AOF和RDB都开启 该策略能够适应绝大部分场景,绝大部分集群架构. 为 ...

  9. [IDEA] chapter_reader - idea看小说插件 idea阅读插件 idea摸鱼插件

    目录 1. 简述: 2. 使用说明: 2.1 版本说明: 2.2 重要说明: 2.3 简单使用方法: 2.4 目前支持的网站有 (新↓): 2.5 菜单介绍: 2.6 快捷键设置及推荐: 2.7 在线 ...

  10. 【划重点】Python xlwt简介和用法

    一.导入xlwt包,并初始化创建一个工作簿 import xlwt workbook=xlwt.Workbook() # 初始化创建一个工作簿 二.创建表单 sheet1=workbook.add_s ...