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. Spring 的Bean管理的常用注解

    属性注入的注解(使用注解注入的方式,可以不用提供set方法) @Value 用于注入普通类型 @Autowired 自动装配 :默认按类型进行装配  按名称注入 @Qualifier 强制使用名称注入 ...

  2. Git-flow 一个简单高效的Git工作流

    背景 由于Git的分支比SVN更好管理且更易使用,最近团队从SVN迁移到Git,需要重新规划开发流程,最终确定使用Git-flow工作流,这是目前比较流行的一种分支模型,下面是Git-flow的简易流 ...

  3. 06_锅炉压力案例_progressbar实现

    相关的native方法可以用javah来生成一个头文件.拿着这个的MainActivity,用它来生成一个头文件. Signature是当前这个方法的方法签名.() V全空参数返回的是void. /* ...

  4. Linux系统基本信息查看

    Linux下如何查看版本信息, 包括位数.版本信息以及CPU内核信息.CPU具体型号等等,整个CPU信息一目了然. 1.# uname -a   (Linux查看版本当前操作系统内核信息)   2.# ...

  5. bzoj 2097: [Usaco2010 Dec]Exercise 奶牛健美操【二分+树形dp】

    二分答案,然后dp判断是否合法 具体方法是设f[u]为u点到其子树中的最长链,每次把所有儿子的f值取出来排序,如果某两条能组合出大于mid的链就断掉f较大的一条 a是全局数组!!所以要先dfs完子树才 ...

  6. P3822 [NOI2017]整数

    传送门 shadowice大佬已经写的非常详细了我就不再写一遍了-- //minamoto #include<bits/stdc++.h> #define u unsigned int # ...

  7. robotframework - 框架做接口自动化get请求

    1.做get请求之前先安装 Request库,参考github上链接 :https://github.com/bulkan/robotframework-requests/#readme 2.请求&a ...

  8. 如何保证access_token长期有效--微信公众平台开发

    http://blog.csdn.net/qq_33556185/article/details/52758781 import javax.servlet.ServletContext; impor ...

  9. MongoDB一些常用指令与他的JavaScript的对应表

  10. hdu6198 number number number(递推公式黑科技)

    number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...