POJ - 1011 剪枝练习
题意:给定n条拆掉的棍子,问能凑成最短的多条相同长度棍子的最短长度
x:当前第几条正在合成的棍子
y:目前正在尝试的拆掉的棍子
z:当前长度
剪枝方案:
1.按照长度单调性排序,减少重复搜索
2.如果当前拼接棍子失败,那接下来相同长度也会失败
3.第一条棍子就失败就不必搜索了
/*H E A D*/
int a[666],tot,ans,sum,n;
bool used[666];
bool dfs(int x,int y,int z){
	if(x==tot+1) return 1;
	if(z==sum/tot)  return dfs(x+1,1,0);
	if(y==n+1) return 0;
	int failed=0;//!!!
	rep(i,y,n){
		if(!used[i]&&z+a[i]<=sum/tot&&failed!=a[i]){
			used[i]=1;
			if(dfs(x,y+1,z+a[i])) return 1;
			failed=a[i];
			used[i]=0;
			if(z==0)return 0;//!!!
		}
	}
	return 0;
}
int main(){
	while(~iin(n)){
		if(n==0)break;
		rep(i,1,n) a[i]=read();
		sort(a+1,a+1+n,greater<int>());
		sum=0;
		rep(i,1,n) sum+=a[i];
		ll ans=oo;
		rrep(i,sum,1){
			if(sum%i==0){
				tot=i;
				memset(used,0,sizeof used);
				if(dfs(1,1,0)){
					 ans=min(ans,(ll)sum/tot);
					 break;
				}
			}
		}
		println(ans);
	}
	return 0;
}
int main(){
	while(~iin(n)){
		if(n==0)break;
		rep(i,1,n) a[i]=read();
		sort(a+1,a+1+n,greater<int>());
		sum=0;
		rep(i,1,n) sum+=a[i];
		ll ans=oo;
		rrep(i,sum,1){
			if(sum%i==0){
				tot=i;
				flag=0;
				memset(used,0,sizeof used);
				if(dfs(1,1,0)){
					 ans=min(ans,(ll)sum/tot);
					 break;
				}
			}
		}
		println(ans);
	}
	return 0;
}
POJ - 1011 剪枝练习的更多相关文章
- DFS(剪枝) POJ 1011 Sticks
		题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ... 
- 搜索+剪枝——POJ 1011 Sticks
		搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ... 
- POJ 1011 Sticks 【DFS 剪枝】
		题目链接:http://poj.org/problem?id=1011 Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissio ... 
- POJ 1011 - Sticks DFS+剪枝
		POJ 1011 - Sticks 题意: 一把等长的木段被随机砍成 n 条小木条 已知他们各自的长度,问原来这些木段可能的最小长度是多少 分析: 1. 该长度必能被总长整除 ... 
- OpenJudge 2817:木棒 / Poj 1011 Sticks
		1.链接地址: http://bailian.openjudge.cn/practice/2817/ http://poj.org/problem?id=1011 2.题目: 总时间限制: 1000m ... 
- poj 1011 Sticks (DFS+剪枝)
		Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 127771 Accepted: 29926 Descrip ... 
- Sticks POJ - 1011  少林神棍 dfs四次剪枝
		http://poj.org/problem?id=1011 题意:若干根棍子被截成小段的木棒,现在给你这些木棒,问最短可以拼出的棍子长度. 题解:搜索,dfs(r,m) 二个参数分别代表还剩r个木棒 ... 
- POJ 1011 Sticks(dfs+剪枝)
		http://poj.org/problem?id=1011 题意:若干个相同长度的棍子被剪成若干长度的小棍,求每根棍子原来的可能最小长度. 思路:很经典的搜索题. 我一开始各种超时,这题需要很多剪枝 ... 
- POJ 1011 Sticks dfs,剪枝 难度:2
		http://poj.org/problem?id=1011 要把所给的集合分成几个集合,每个集合相加之和ans相等,且ans最小,因为这个和ans只在[1,64*50]内,所以可以用dfs一试 首先 ... 
随机推荐
- ShopNc登录
- 在slam_gmapping中使用Log数据创建地图
			本文介绍使用机器人记录的tf变换和激光扫描数据来建立2D地图.并在ROS的图形化模拟环境rviz中通过重新回放记录的数据作为机器人真实传感器采集的输入,来观测地图动态创建过程. 1.ROS gmapp ... 
- 编写高质量代码改善C#程序的157个建议——建议60:重新引发异常时使用Inner Exception
			建议60:重新引发异常时使用Inner Exception 当捕获了某个异常,将其包装或重新引发异常的时候,如果其中包含了Inner Exception,则有助于程序员分析内部信息,方便代码调试. 以 ... 
- Android Bundle传递数据
			1.传递普通数据 Intent intent=new Intent(MainActivity.this,TwoActivity.class); Bundle bundle=new Bundle(); ... 
- Bitmap压缩到指定尺寸大小,获取圆角、圆形图片
			/** * 使用Matrix将Bitmap压缩到指定大小 * @param bitmap * @param w * @param h * @return */ public static Bitmap ... 
- NPOI row.Cells[i] 的坑
			我有A行B列的EXCEL表格: 获取一行数据: IRow row=sheet.GetRow(i); 正常是这样的 row.Cells.Count = B; 但由于会存在没有激活的单元格,导致 row. ... 
- 为什么 kubernetes 天然适合微服务 (3)
			此文已由作者刘超授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 四.Kubernetes 本身就是微服务架构 基于上面这十个设计要点,我们再回来看 Kubernetes,会发现 ... 
- 初学python - 零碎的知识点
			* 标识符命名规则 数字,字母,下划线组成,数字不能开头区分大小写 * 注释 单行:#:多行:‘ ‘ ‘ ,“”“: * 进制标识 b:二进制 o:八进制 d:十进制x:十六进制 转换:format( ... 
- 拆半搜索binary_search
			//binary_search用于在有序的区间用拆半查找搜索等于某值得元素 #include<algorithm> #include<iostream> using names ... 
- F - ACboy needs your help again! (模拟)
			ACboy was kidnapped!! he miss his mother very much and is very scare now.You can't image how dark th ... 
