P1120 小木棍 [数据加强版]

题目描述

乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过5050。

现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。

给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。

搜索+剪枝

先贴一个70分的代码:

#include<bits/stdc++.h>

#define N 1010
using namespace std; int n,a[],tot,sum,sh[N]; bool vis[N],flg,pvis[]; void scz(int k){
for(int i=;i<=k;i++) pvis[sh[i]]=;
} void dfs(int k,int l,int L){
if(l==L){
++sum;
if(sum*L==a[]) flg=;
scz(k-);
return;
}
for(int i=;i<=tot;i++){
if(!vis[i]&&l+a[i]<=L&&!pvis[i]){
vis[i]=;sh[k]=i;
dfs(k+,l+a[i],L);
vis[i]=;
}
}
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&a[++tot]);
if(a[tot]>) --tot;
// a[0]+=a[tot];
a[n+]=max(a[n+],a[tot]);
}
for(int i=;i<=tot;i++)
a[]+=a[i];
// ,printf("%d\n",a[i]);
// printf("%d\n",a[0]); for(int i=a[n+];i<=a[];i++){
memset(pvis,,sizeof(pvis));
if(a[]%i==){
sum=;
dfs(,,i);
if(flg){
printf("%d\n",i);
break;
}
}
}
return ;
}

剪枝大法好

#include<bits/stdc++.h>

#define N 1010
using namespace std; int n,a[],tot,sum,L,last; bool vis[N]; bool dfs(int R,int M){//还剩下的木棍,需要拼凑的木棍长度
if(R==&&M==)
return true;
if(M==)
M=L;
int st=;
if(M!=L)
st=last+;//剪枝4,从下一根更短的进行尝试 ,而不是从头开始
for(int i=st;i<=tot;i++){
if(!vis[i]&&a[i]<=M){
if(i>&&vis[i-]==false&&a[i]==a[i-]){
continue;
}//剪枝1,如果上一个没被选中且当前这一个与上一个长度相等
vis[i]=;last=i;
if(dfs(R-,M-a[i])) return true;
else vis[i]=;
if(M==L||a[i]==M)
return false;//剪枝2,如果第一根木棍不能更新,那么就永远不能更新
//剪枝3 如果当前木棍在==M的情况下不能成功,那就不可能成功
}
}
return false;
} bool cmp(int x,int y) {
return x>y;
} int main() {
scanf("%d",&n);
for(int i=; i<=n; i++) {
scanf("%d",&a[++tot]);
if(a[tot]>) --tot;
a[n+]=max(a[n+],a[tot]);
}
for(int i=; i<=tot; i++)
a[]+=a[i];
sort(a+,a++tot,cmp); for( L=a[n+]; L<=a[]/; L++) {
memset(vis,,sizeof(vis));
if(a[]%L) continue;
if(dfs(tot,L)){
printf("%d\n",L);
break;
}
}
if(L>a[]/) printf("%d\n",a[]);
return ;
}

剪枝方法总结:

1) 要选择合适的搜索顺序 如果一个任务分为 A, B, C…..等步骤(先后次序无关), 要优先尝试可能性少的步骤

2) 要发现表面上不同,实质相同的重复状态,避免重复的搜索

3) 要根据实际问题发掘剪枝方案

洛谷——P1120 小木棍 [数据加强版]的更多相关文章

  1. 洛谷 P1120 小木棍 [数据加强版]解题报告

    P1120 小木棍 [数据加强版] 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它 ...

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

    P1120 小木棍 [数据加强版] 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它 ...

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

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

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

    题目大意:有一些同样长的木棍,被切割成几段(长$\leqslant$50).给出每段小木棍的长度,找出原始木棍的最小可能长度. 题解:dfs C++ Code: #include<cstdio& ...

  5. 一本通&&洛谷——P1120 小木棍 [数据加强版]——题解

    题目传送 一道特别毒瘤能提醒人不要忘记剪枝的题. 首先不要忘了管理员的话.忘把长度大于50的木棍过滤掉真的坑了不少人(包括我). 显然是一道DFS题 .考虑剪枝. 找找搜索要面临的维度.状态:原始木棍 ...

  6. 洛谷P1120 小木棍 [数据加强版]搜索

    玄学剪支,正好复习一下搜索 感觉搜索题的套路就是先把整体框架打出来,然后再一步一步优化剪枝 1.从maxv到sumv/2枚举长度(想一想,为什么) 2. 开一个桶,从大到小开始枚举 3. 在搜索中,枚 ...

  7. P1120 小木棍 [数据加强版] 回溯法 终极剪枝

    题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过5050. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度 ...

  8. P1120 小木棍 [数据加强版]

    题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编 ...

  9. P1120 小木棍 [数据加强版](poj 1011)

    题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编 ...

随机推荐

  1. XMU 1040 Schedule 【拓扑排序】

    1040: Schedule Time Limit: 500 MS  Memory Limit: 64 MBSubmit: 12  Solved: 2[Submit][Status][Web Boar ...

  2. Interval 计时器

    语法: setInterval(代码,交互时间); 在执行时,从载入页面后每隔指定的时间执行代码. clearInterval( setInterval() 返回的 ID 值 ): 取消计时器 < ...

  3. USACO 刷题有感

    最近每天都尽量保持着每天一道USACO的题目,呵呵,一开始都是满简单的,一看题目基本上思路就哗啦啦地出来了,只不过代码实现有点麻烦,花了一些时间去调试,总体感觉还不错,但是越往后做,应该就很难保持一天 ...

  4. BZOJ_2565_最长双回文串_manacher

    BZOJ_2565_最长双回文串_manacher Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不 ...

  5. ZOJ3962 2017 E.Seven Segment Display

    数码管从某个状态顺序转移N个状态 计算总共有多少个数码管被点亮 N<=10^9 观察数码管的变化规律,有明显的周期和重复,利用这个性质,计算相对于初始状态,某一位上的某个状态重复了多少次,就可以 ...

  6. javascript 模块化编程----模块的写法

    一.原始写法 模板就是实现特定功能的一组方法 只要把不同的函数(以及记录状态的变量)简单地放在一起,就算是一个模块. function m1(){ //... } function m2(){ //. ...

  7. Photoshop CC2019破解版

    Photoshop CC2019 精简版: 链接:https://pan.baidu.com/s/1PeFrhtLHxLRXCW_vMkAZDg  提取码:q6nl Photoshop CC2019: ...

  8. GG_Model 类库与数据库表对应建立实体类

    3.4.GG_Model 类库与数据库表对应建立实体类 我这里不教大家写代码,直接用TT模板自动生成,省去写代码的麻烦. A. 三个文件MysqlDbhelper.ttinclude .mysqlMa ...

  9. Linux安装MySQL标准教程

    导读: 本文主要介绍 CentOS 系统二进制安装 MySQL 5.7.23 版本的安装步骤,其他版本安装过程相似. 1.前置准备 卸载旧版MySQL 查看rpm包 rpm -qa|grep mysq ...

  10. C#基础 结构体 枚举类型

    结构体:就是一个自定义的集合,里面可以放各种类型的元素,用法大体跟集合一样. 一.定义的例子: struct student { public int nianling; public int fen ...