http://poj.org/problem?id=1011

这是一道POJ的搜索的题目,最开始确实难以理解,但做过一些搜索的题目后,也没那么难了。

大概题意就是,现在有N根木头,要拼成若干根木头,并且这些木头要相等的长度,并且每一根木头都要用上,求组成的木头最短长度是多少

思路:

  首先木头肯定要由大到小进行排序,组成的最短的木头的长度的范围应该在最长的木头到所有的木头之和之间。

  其次就是木头使用过后不能在使用,所以木头应该进行标记。

  

 #include <stdio.h>
#include <stdlib.h>
#include <string.h> int num,n,sum,a[],alen;
bool mark[]; int cmp(const void *a,const void *b)
{
return *((int *)b)-*((int *)a);
} int dfs(int stick,int len,int pos) //stick代表组成的第几根棍子,len表示当前组成的棍子的长度,pos表示现在的用的几根木棍。
{
if(stick==num) return ; //如果组成的木棍数等于预计的木棍数,则搜索成功。
for(int i=pos;i<n;i++)
{
if(!mark[i]) continue;      //如果这一根木棍用过,则跳过这个木棍。
if(a[i]+len==alen){        
mark[i]=false;
if(dfs(stick+,,))    //如果第i根木棍成功匹配,则进行下一个木棍的匹配。
return ;
mark[i]=true;        //如果下一个木棍未匹配成功的话,则当前这个木棍是不能使用的。
return ;          
}else if(a[i]+len<alen){
mark[i]=false;    
if(dfs(stick,len+a[i],i))    //当前木棍加起来比预计的长度要短,则搜索下一个木头,看是否可以匹配到。
return ;
mark[i]=true;        //如不能寻找到,则这个木头也是不能使用的。
if(len==) break;      
while(a[i]==a[i+]) i++;    //如果当前的a[i]不能用,且a[i]==a[i+1]的话,那么a[i+1]也没用,如果程序可以运行到这来,则说明a[i]是不能与当前这根木头所匹配的。
}
}
return ;
} int main()
{ while(scanf("%d",&n),n!=)
{
sum=;
for(int i=;i<n;i++){
scanf("%d",&a[i]);
sum+=a[i];
}
qsort(a,n,sizeof(a[]),cmp);
for(alen=a[];alen<=sum;alen++)  //最坏的情况也就是只有一根木头,所以alen是小于sum的,我也就这里错了,wa了几次
if(sum%alen==) {
memset(mark,true,sizeof(mark));
num=sum/alen;
if(dfs(,,)){
printf("%d\n",alen);
break;
}
}
}
return ;
}

poj 1011的更多相关文章

  1. DFS(剪枝) POJ 1011 Sticks

    题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...

  2. OpenJudge 2817:木棒 / Poj 1011 Sticks

    1.链接地址: http://bailian.openjudge.cn/practice/2817/ http://poj.org/problem?id=1011 2.题目: 总时间限制: 1000m ...

  3. POJ 1011 - Sticks DFS+剪枝

    POJ 1011 - Sticks 题意:    一把等长的木段被随机砍成 n 条小木条    已知他们各自的长度,问原来这些木段可能的最小长度是多少 分析:    1. 该长度必能被总长整除    ...

  4. 搜索+剪枝——POJ 1011 Sticks

    搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ...

  5. POJ 1011 Sticks 【DFS 剪枝】

    题目链接:http://poj.org/problem?id=1011 Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissio ...

  6. POJ 1011 Sticks dfs,剪枝 难度:2

    http://poj.org/problem?id=1011 要把所给的集合分成几个集合,每个集合相加之和ans相等,且ans最小,因为这个和ans只在[1,64*50]内,所以可以用dfs一试 首先 ...

  7. poj 1011 搜索减枝

    题目链接:http://poj.org/problem?id=1011 #include<cstdio> #include<cstring> #include<algor ...

  8. poj 1011 Sticks (DFS+剪枝)

    Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 127771   Accepted: 29926 Descrip ...

  9. Sticks POJ - 1011 少林神棍 dfs四次剪枝

    http://poj.org/problem?id=1011 题意:若干根棍子被截成小段的木棒,现在给你这些木棒,问最短可以拼出的棍子长度. 题解:搜索,dfs(r,m) 二个参数分别代表还剩r个木棒 ...

随机推荐

  1. javascript模块简单写法

    写法1: (function (wd, doc) { var mw = {}; mw.noConflict = noConflict; var _$ = wd.$; wd.$ = mw; functi ...

  2. Task异常处理

    http://www.cnblogs.com/xray2005/archive/2011/08/24/2151459.html

  3. oracle 特殊符号

    http://hi.baidu.com/wind_stay/blog/item/85113a6f6553a5d680cb4a0e.html oracle通配符,运算符的使用 用于where比较条件的有 ...

  4. iOS数据库学习(1)-安装Navicat

    1.下载Navicat Premium 11.0.16.dmg 已经放到百度网盘,里面有安装文件和注册机 下载链接: http://pan.baidu.com/s/1sjI64HZ  密码: 2h7q ...

  5. [MongoDB]入门操作

    摘要 在工作中也经常使用mongodb,每次遇到新的操作都需要去查,比较麻烦,准备在博客中系统的学习一下mongodb.首先在本地安装mongodb环境,可以下载一个windows的版本. 官网地址 ...

  6. List之Union(),Intersect(),Except()

    http://www.cnblogs.com/qinpengming/archive/2012/12/03/2800202.html List之Union(),Intersect(),Except() ...

  7. Eclipse构建Maven项目

    1. 安装m2eclipse插件     要用Eclipse构建Maven项目,我们需要先安装meeclipse插件     点击eclipse菜单栏Help->Eclipse Marketpl ...

  8. 【Junit】JUnit-4.12使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误

    下载了最新的JUnit版本,是4.12,结果尝试使用发现总是报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing这样的错误, 上网查 ...

  9. Redhat系统网络配置

    1.RedHat系统的网络配置文件/etc/sysconfig/network-scirpts/ifcfg-<interface-name>文件 DEVICE=eth0           ...

  10. 微信封号浪潮再起 A货假代购还能在朋友圈泛滥多久?

    你的微信朋友圈是不是很活跃?是不是被很多所谓的名品所包围?没错,这些很多都是A货或假代购的伎俩.如果xmyanke的微信朋友圈出现这些东东,我就会直接屏蔽他的朋友圈权限.具体方法是:打开他的微信详细资 ...