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. -bash: sudo: command not found Error and Solution

    文章转自: http://www.cyberciti.biz/faq/debian-ubuntu-rhel-centos-linux-bash-sudo-command-not-found/ 安装su ...

  2. 使用DOS比较两个txt文件的差异

    将两个文件放入到同一个文件夹下 DOS下提供了FC命令 点击开始->运行->输入cmd,进入DOS下,进入指定目录,输入FC a.txt b.txt进行比较,下面会显示出之间的差异

  3. Unity API

    关于 int Mathf.PingPong(t, length); 原理,相当于 #include <iostream> #include <vector> int test( ...

  4. Java基础相关总结

    临近面试,权当复习了吧 final相关 定义常量的方法  eg:final int i=0;//则i不能被修改 final修饰的类不能被继承,因此没有子类,且它的类中的方法默认是final final ...

  5. 2015年12月03日 GitHub入门学习(五)Markdown语法简介

    Markdown一种标记语言,语法简洁,不像Word或Pages有大量排版.字体设置.常用的标记符号不超过十个.被大量写作爱好者.撰稿人.作家所青睐. 一.Markdown的优点 专注你的文字内容而不 ...

  6. POJ 2411 Mondriaan&#39;s Dream

    状压DP Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 9938 Accepted: 575 ...

  7. 如何编写可维护的面向对象JavaScript代码

    能够写出可维护的面向对象JavaScript代 码不仅可以节约金钱,还能让你很受欢迎.不信?有可能你自己或者其他什么人有一天会回来重用你的代码.如果能尽量让这个经历不那么痛苦,就可以节省不少时 间.地 ...

  8. Mac 如何安装Homebrew?

    到Github官网上搜索Homebrew,找到对应的Homebrew后,查看它的安装文档,链接如下: https://github.com/Homebrew/homebrew/blob/master/ ...

  9. String、StringBuffer、StringBuilder的不同使用场景

    String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...

  10. python __name__

    当你打开一个.py文件时,经常会在代码的最下面看到if __name__ == '__main__':,现在就来介 绍一下它的作用. 模块是对象,并且所有的模块都有一个内置属性 __name__.一个 ...