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. 序列化模块之 pickle 和 json

    用于序列化的两个模块: json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 Json模块提供了四个功能:dumps ...

  2. kafka C客户端librdkafka producer源码分析

    from:http://www.cnblogs.com/xhcqwl/p/3905412.html kafka C客户端librdkafka producer源码分析 简介 kafka网站上提供了C语 ...

  3. html中 table的结构 彻底搞清 caption th thead等

    正因为有太多 随意 称呼的 教法, 所以 感到很困惑, 如, 很多人把th叫标题. 那人家 caption怎么想, th只是一个跟td一样的角色, 只是对他进行加粗 加黑了而已, 用于某些单元格的内容 ...

  4. Hadoop伪分布式搭建(一)

     下面内容主要说明在Windows虚拟机上面,怎么搭建一个Hadoop伪分布式,并如何运行wordcount程序和网页查看HDFS文件系统. 1 相关软件下载和安装 APACH官网提供hadoop版本 ...

  5. 全屏背景:15个jQuery插件实现全屏背景图像或媒体

    动态网站通常利用背景图像或预加载屏幕,以保证所有资源都加载到页面上,在浏览器中充分呈现.现在很多网站都炫耀自己的图像作为背景图像全屏背景,追溯到旧的Flash网站却用自己的方式在HTML资源重布局. ...

  6. PHP弹出提示框并跳转到新页面即重定向到新页面

    本文为大家介绍下使用PHP弹出提示框并跳转到新页面,也就是大家所认为的重定向,下面的示例大家可以参考下   这两天写一个demo,需要用到提示并跳转,主要页面要求不高,觉得没必要使用AJAX,JS等, ...

  7. java实现文件单词频率统计 topN top K

    java 实现单词计数.top N 思路 先统计每个单词出现的个数 利用 TreeSet 的自动排序的功能 上代码 wordcount public void wordCount() { String ...

  8. tcp三次握手与四次挥手

  9. memcache安装

    windows下访问 http://pecl.php.net/package/memcache/3.0.8/windows 下载对应版本memcache的dll文件添加到php目录ext下 PHP.i ...

  10. 网页兼容浏览器测试工具Multibrowser

    网页兼容性测试工具(MultiBrowser),有firefox,chrome,IE 下载