题目的大致意思是:

如今有n根木棍,然后须要把它们拼成相同长度的木棍,问满足这个条件的最短的长度是多少?

想法嘛:那肯定是dfs把长度搜一遍就好,但问题的关键是这里会超时。那么就要用到剪枝的原理了。

下面部分是来自于pku的gw老师说哒

1)不要在同一个位置多次尝试同样长度的木棒(在某一次拼接时选择长度为s的木棒导致拼接失败。则在同一位置尝试下一根木棒时。要跳过全部长度为s的木棒)

2)假设因为以后的拼接失败。须要又一次调整第i根棍子的拼法,则不会考虑替换第i根棍子中的第一根木棒。

3)不要希望通过只替换已经拼好的棍子的最后一根木棒就能改变失败的局面。

4)拼每一根棍子的时候,应确保已经拼好的部分,长度是从长到短排列的(由于我们应该先拼长的,长的可能性小)

排除方法:每次找一根木棒的时候,仅仅要这不是一根棍子的第一条木棒。那么不应该从下标为0的木棒開始找,而应该从刚刚接上去的那条木棒的下一条開始找(当然。我们要先对木棒进行从大到小的排序)

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
#define maxn 70
int a[maxn],n,L,vis[maxn],lastnum=0;
bool cmp(int a,int b){
return a>b;
}
//当前还余下的棍子的个数和还缺的长度
bool dfs(int m,int l){
if(m==0&&l==0) return true;
if(l==0) l=L;
int s=1;
//剪枝4
if(l!=L){
s=lastnum+1;
}
for(int i=s;i<=n;i++){
if(!vis[i-1]&&i>1&&a[i]==a[i-1]) continue; //剪枝1
if(!vis[i]&&a[i]<=l){
vis[i]=1;
lastnum=i;
if(dfs(m-1,l-a[i])) return true;
else{
vis[i]=0;
if(L==l||a[i]==l) return false; //剪枝2,3
}
}
}
return false;
}
int main(){
while(~scanf("%d",&n)){
if(n==0) break;
memset(a,0,sizeof(a));
int sum=0,lmax=-1;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(a[i]>lmax) lmax=a[i];
sum+=a[i];
}
int i=0;
sort(a+1,a+1+n,cmp);
#if 1
for(i=lmax;i<=sum/2;i++){
if(sum%i) continue;
L=i;
memset(vis,0,sizeof(vis));
lastnum=0;
if(dfs(n,i)){
printf("%d\n",i);
break;
}
}
if(i>sum/2) printf("%d\n",sum);
#endif
}
}
/*
9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0
*/

最新文章

  1. 关于MySQL的wait_timeout连接超时问题报错解决方案
  2. Unity3D入门之Unity3D介绍以及编辑器的使用(1)
  3. mac 启动apache服务
  4. MVC - 20.前台ajax分页
  5. Axure 注册码
  6. [前端JS学习笔记]JavaScript 数组
  7. MYSQL 体系结构图 log commit
  8. http2.0
  9. python bottle使用多个端口(多个进程)提高并发
  10. git用法-打补丁
  11. FileSystemWatcher类监控文件的更改状态并且实时备份文件
  12. 给外行或者刚入门普及一下关于C#,.NET Framework(.NET框架),.Net,CLR,ASP,ASP.Net, VS,以及.NET Core的概念
  13. vue的图片上传
  14. NGINX按天生成日志文件的简易配置
  15. opencv读取摄像头实时流代码
  16. html中子界面与父界面相互操作或传值
  17. vue开发移动端项目 过渡动画问题
  18. CSS学习总结2:CSS框模型
  19. scrapy定时执行抓取任务
  20. MVC教程六:视图的寻址

热门文章

  1. 【php】Windows PHP及xdebug安装 安装
  2. python logging with yaml
  3. js 类型之间的相互转化
  4. BFS:UVa220 ACM/ICPC 1992-Othello(黑白棋)
  5. ACM Changchun 2015 A. Too Rich
  6. Oracle常用查询语句
  7. 【02】markdown工具推荐
  8. [android开放篇] wifi-direct接口网址
  9. 树状数组 gcd 查询 Different GCD Subarray Query
  10. 【Luogu】P2522Problemb(莫比乌斯反演)