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. 纯css3实现美化复选框和手风琴效果(详细)

    关键技术点和原理: 原理就是把 checkbox或 radio 给隐藏掉   ,然后给选框 绑定一个label标签. 然后用label标签作为容器,在里面放一个:before或一个after 用bef ...

  2. tflearn 保存模型重新训练

    from:https://stackoverflow.com/questions/41616292/how-to-load-and-retrain-tflean-model This is to cr ...

  3. android EditText如何使光标随着输入内容移动

    EditText 使光标随着输入内容移动的setSelection()

  4. Spring Theme简单应用

    Spring MVC特性里由一个是关于Spring Theme主题的应用,所以写了个Demo 1.这里先看项目结构(Meven项目) 2.所需的POM依赖 <dependency> < ...

  5. java程序死锁,3种方式快速找到死锁代码

    java程序中出现死锁问题,如果不了解排查方法,是束手无策的,今天咱们用三种方法找到死锁问题. 运行下面代码 package com.jvm.visualvm; /** * <a href=&q ...

  6. GoAhead4.1.0 开发总结一(移植)

    环境 官方文档:https://www.embedthis.com/goahead/doc/ 源码下载: goahead-4.1.0-src.tgz 系统平台:Ubuntu 12.04.4 gcc v ...

  7. UVa 101 - The Blocks Problem STL

    题目:给你n个方块,有四种操作: .move a onto b,把a和b上面的方块都放回原来位置,然后把a放到b上面: .move a over b,把a上面的放回原处,然后把a放在b所在的方块堆的上 ...

  8. [Qt Creator 快速入门] 第5章 应用程序主窗口

    对于日常见到的应用程序而言,许多都是基于主窗口的,主窗口中包含了菜单栏.工具栏.状态栏和中心区域等.这一章会详细介绍主窗口的每一个部分,还会涉及资源管理.富文本处理.拖放操作和文档打印等相关内容.重点 ...

  9. docker血一样的教训,生成容器的时候一定要设置数据卷,把数据文件目录,配置文件目录,日志文件目录都要映射到宿主机上保存啊!!!

    打个比方,比如mysql,如果你想重新设置一下mysql的配置,不小心配错里,启动容器失败,已启动就停止了. 根本进不去mysql的容器里.如果之前run容器的时候,没有把数据文件,日志文件,配置文件 ...

  10. C#---数据库访问通用类、Access数据库操作类、mysql类 .

    //C# 数据库访问通用类 (ADO.NET)using System;using System.Collections.Generic;using System.Text;using System. ...