题目描述

乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过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. 【Python】【Module】os

    os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于shell下cd os.curd ...

  2. vueAPI (data,props,methods,watch,computed,template,render)

    data Vue 实例的数据对象.Vue 将会递归将 data 的属性转换为 getter/setter,从而让 data 的属性能够响应数据变化.实例创建之后,可以通过vm.$data来访问原始数据 ...

  3. 测试JDBCUtils的重用性

    package cn.itcast.jdbc;import cn.itcast.util.JDBCUtils;import java.sql.*;import java.util.Properties ...

  4. 1.RabbitMQ

    1.RabbitMq是什么?    MQ全称为Message Queue,即消息队列, RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队 ...

  5. .Net Core MVC全局过滤器验证是否需要登录

    1.新增全局登录过滤器LoginCheckAttribute 1 public class LoginCheckAttribute: ActionFilterAttribute 2 { 3 publi ...

  6. 前端浅谈-协议相关(DNS协议)

    从应用层到实体层的协议太多了,我们并不能一一涉及,目前来说就打算整理可能会与前端相关的协议. 前端面试常会问到一个问题-"从输入一个url到页面渲染经历了哪些过程".这其实是一个相 ...

  7. Python 字典是如何解决哈希冲突的

    本文主要翻译自 so 上面的问题 Why can a Python dict have multiple keys with the same hash? 下 Praveen Gollakota 的答 ...

  8. mysql数据库总结笔记

    一.安装和配置数据库: 下载mysql地址:https://dev.mysql.com/downloads/mysql/ windows下载的版本是installer msi版本:https://de ...

  9. mdf与ldf文件如何还原到SQL Server数据库

    1,首先新建两个数据库(Db1,Db2) 在Db1数据库中添加一个表: 然后点击数据库右键-属性-文件-找到文件路径 然后复制这个路径中的Db1的数据,把这两个文件放到其他文件之下 复制之前需要关闭S ...

  10. c++11之all_of 、 any_of 和 none_of 的用法

    0.时刻提醒自己 Note: vector的释放 1.区别 函数 功能 all_of 区间[开始, 结束)中是否所有的元素都满足判断式p,所有的元素都满足条件返回true,否则返回false. any ...