POJ 1011 Sticks dfs,剪枝 难度:2
http://poj.org/problem?id=1011
要把所给的集合分成几个集合,每个集合相加之和ans相等,且ans最小,因为这个和ans只在[1,64*50]内,所以可以用dfs一试
首先ans需要满足两个条件1.可以被总集合的和sum整除 2.是总集合的某个子集的和 对于条件1,可以通过试除遍历 对于条件2,可以通过dp预筛选,这两个花费时间都不大
接着搜索能不能划分成集合之和恰为ans的若干集合,
1. 可以从大向小找,因为大的更不灵活,而且所有的元素都需要取到
2.比如对于5,4,2,2,1 使用第一个2,向下找,没有找到答案,不用第一个2之后,也不需要再找第二,第三个2了
如果之前找过相同的数字了,那么之后就不用再找相同的数字
3.如果这次数字刚好组合成为一个ans,那么能不能组成由剩下的数字决定,也就是已经得到了一个新集合和为ans了,剩下的能够组成若干和为ans的集合则可以取ans,否则不能取ans
#include <cstdio>
#include<cstring>
#include <algorithm>
using namespace std;
int a[64],n;
bool cmp(int a,int b){return a>b;}
bool reachable[64*51];
bool used[64];
bool dfs(int s,int tmp,int sub){
// printf("s:%d tmp:%d sub:%d\n",s,tmp,sub);
used[s]=true;
tmp+=a[s];
if(tmp>sub){// 不可能出现
puts("ERROR");
used[s]=false;
return false;
}
if(tmp==sub){//恰好成为一个和为ans的集合
for(int i=0;i<n;i++){
if(!used[i]){
if(dfs(i,0,sub))return true;//dfs新的集合,直接返回剩下的元素能不能组合成若干和为ans的集合
else {
used[s]=false;
return false;
}
}
}
return true;//所有元素都被使用了
}
int f=-1;
for(int i=s+1;i<n;i++){
if(f==a[i]||used[i]){continue;}//如果这个状态的这个函数已经找过相同的数
if(tmp+a[i]==sub){//直接返回剩下的元素的组合状态
if(dfs(i,tmp,sub))return true;
else {
used[s]=false;
return false;
}
}
else if(tmp+a[i]<sub){//可以试着添加进这个集合
if(dfs(i,tmp,sub))return true;
}
f=a[i];
}
used[s]=false;
return false;
}
int main(){
while(scanf("%d",&n)==1&&n){
int sum=0,mx=0;
memset(reachable,false,sizeof(reachable));
for(int i=0;i<n;i++){
scanf("%d",a+i);
sum+=a[i];
mx=max(a[i],mx);
}
reachable[a[n-1]]=true;
reachable[0]=true;
sort(a,a+n,cmp);//从大到小搜索
for(int i=n-2;i>=0;i--){
for(int j=0;j<sum&&j+a[i]<=sum;j++){
if(reachable[j]){
reachable[j+a[i]]=true;//reachable[i]=true i可以被总集合中的某些元素加和得到
}
}
}
bool fnd=false;
for(int i=mx;i<sum;i++){
if(sum%i==0&&reachable[i]){
memset(used,0,sizeof(used));
if(dfs(0,0,i)){
printf("%d\n",i);
fnd=true;
break;
}
}
}
if(!fnd)printf("%d\n",sum);
} return 0;
}
POJ 1011 Sticks dfs,剪枝 难度:2的更多相关文章
- POJ 1011 - Sticks DFS+剪枝
POJ 1011 - Sticks 题意: 一把等长的木段被随机砍成 n 条小木条 已知他们各自的长度,问原来这些木段可能的最小长度是多少 分析: 1. 该长度必能被总长整除 ...
- poj 1011 Sticks ,剪枝神题
木棒 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 118943 Accepted: 27429 Description 乔治拿 ...
- DFS(剪枝) POJ 1011 Sticks
题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...
- 搜索+剪枝——POJ 1011 Sticks
搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ...
- poj 1011 Sticks (DFS+剪枝)
Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 127771 Accepted: 29926 Descrip ...
- POJ 1011 Sticks 【DFS 剪枝】
题目链接:http://poj.org/problem?id=1011 Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissio ...
- poj 1011 :Sticks (dfs+剪枝)
题意:给出n根小棒的长度stick[i],已知这n根小棒原本由若干根长度相同的长木棒(原棒)分解而来.求出原棒的最小可能长度. 思路:dfs+剪枝.蛮经典的题目,重点在于dfs剪枝的设计.先说先具体的 ...
- OpenJudge 2817:木棒 / Poj 1011 Sticks
1.链接地址: http://bailian.openjudge.cn/practice/2817/ http://poj.org/problem?id=1011 2.题目: 总时间限制: 1000m ...
- uva 215 hdu 1455 uvalive5522 poj 1011 sticks
//这题又折腾了两天 心好累 //poj.hdu数据极弱,找虐请上uvalive 题意:给出n个数,将其分为任意份,每份里的数字和为同一个值.求每份里数字和可能的最小值. 解法:dfs+剪枝 1.按降 ...
随机推荐
- [转载] Google数据中心网络技术漫谈
原文: http://www.sdnlab.com/12700.html?from=timeline&isappinstalled=0#10006-weixin-1-52626-6b3bffd ...
- 学习日记day8:移动端页面流程优化
一:切图 1:切那些(移动端能不用图片就不用图片:logo单独切因为要带链接) 2:普通切(快捷键:复制到新图层 选中 复制 新建 粘贴 保存) 3:类似切 (选中多个图层 矩形框多选 选择工 ...
- 2014 Multi-University Training Contest 4
1006 hdu4902 #include <iostream> #include<stdio.h> #include<vector> #include<qu ...
- GCC编译器和GDB调试器常用选项
http://blog.csdn.net/u014328976/article/details/46745349 GCC编译器 gcc hello.c -o hello ...
- Java源码初学_LinkedList
一.LinkedList的内部数据结构 LinkedList底层是一个链表的数据结构,采用的是双向链表,基本的Node数据结构代码如下: private static class Node<E& ...
- Web服务器异常问题记录
1.使用命令,出现"-bash: 命令: Input/output error" 重启服务器后正常,网上查了下是说硬盘写入读取异常,经过和服务器厂商沟通后,确认是硬件问题导致(硬盘 ...
- NumPy(Numeric Python)使用方法
NumPy官网 参考:<Python数据分析基础教程:NumPy学习指南> 用Python做科学计算(好东西) NumPy是python的核心库,是python机器学习编程的最底层的库,不 ...
- 中医与DBA
很多药方,只要吃不死,总有一款适合你.哈哈.我要做西医,先检查身体,再了解每种药的作用,做到对症下药.
- Linux源码安装mysql步骤
创建文件夹: mkdir /usr/local/webserver 安装必要依赖包 yum -y install gcc gcc-c++ make ncurses-devel安装cmake ...
- MySQL for Windows 解压缩版配置安装
1.MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi格式的可以直接点击安装,按照它给出的安装提示进行安装(相信大家的英文可以看懂英文提示),一般MySQL将会安装在C: ...