题目的大意是给了你有限个棍子以及每个棍子的长度,而且所有的棍子都是由有限个长度相同的棍子截断得到的,让你求被截棍子的最小长度

搜索剪枝神题,做的我够呛

提供一个比较好的解题报告  http://www.cnblogs.com/mycapple/archive/2012/08/14/2638430.html

比较奇怪的是数组开小了WA了,开大就过了

代码还是比较挫的

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std; int shu[];
int hash[];
int feng,n,ok,chu,fail;
int nhash[]; void dfs(int all,int add)
{
int i;
if(add==chu){
ok=;return ;
}
if(ok==||fail==){
return ;
}
if(all>&&hash[]==){ //第一根木棍没有被利用,就结束整个搜索
fail=;return;
} for(i=;i<=n;i++){
if(hash[i]==)continue; if(all==(add*feng)){
if(hash[i-]==){//当前的第一根木棍 组成一定要成功
return;
}
}
if((all+shu[i])<=((add+)*feng)){
if(shu[i-]==shu[i]&&hash[i-]==)continue;
hash[i]=;
if((all+shu[i])==((add+)*feng))
dfs(all+shu[i],add+);
else
dfs(all+shu[i],add);
hash[i]=;
}
}
} int cmp(int a,int b){
return a>b;
} int main()
{
int all,i,j;
while(scanf("%d",&n)!=EOF){
if(n==)return ;
int max=,temp;
all=; for(i=;i<=n;i++){
scanf("%d",&shu[i]);
all+=shu[i];
if(shu[i]>max)max=shu[i];
}
sort(&shu[],&shu[n+],cmp); for(i=max;i<=all;i++){
if(all%i!=)continue;
for(j=;j<=n;j++)hash[i]=;
hash[]=;
feng=i;
chu=all/i;
fail=;
ok=;
dfs(,);
if(ok==)break;
} printf("%d\n",feng);
} return ;
}

poj1011---DFS的更多相关文章

  1. poj1011 Sticks(DFS+剪枝)

    题目链接 http://poj.org/problem?id=1011 题意 输入n根棍子的长度,将这n根棍子组合成若干根长度相同的棍子,求组合后的棍子的最小长度.这题是poj2362的加强版,思路与 ...

  2. poj1011(DFS+剪枝)

    题目链接:https://vjudge.net/problem/POJ-1011 题意:给定n(<=64)条木棍的长度(<=50),将这些木棍刚好拼成长度一样的若干条木棍,求拼出的可能的最 ...

  3. POJ1011 (DFS+剪枝)

    Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 129606   Accepted: 30388 Descrip ...

  4. poj1011 Sticks(dfs+剪枝)

    Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 110416   Accepted: 25331 Descrip ...

  5. poj1011 && uva307 DFS + 剪枝

    将木棒从大到小排列,保证每次的选择都是最长可选的木棒. 剪枝: 1 . 如果第 i 根木棒被选择却无法成功拼接,那么后面与其长度相同的也不能选择. 2 . 如果第 cnt + 1 根木棒无法成功拼接, ...

  6. poj1011 Sticks (dfs剪枝)

    [题目描述] George took sticks of the same length and cut them randomly until all parts became at most 50 ...

  7. dfs+剪枝 poj1011

    Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 113547   Accepted: 26078 问题描述 Ge ...

  8. POJ1011 木棒(dfs+剪枝)

    问题重述: Description乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始 ...

  9. 【poj1011】 Sticks

    http://poj.org/problem?id=1011 (题目链接) 题意 给出一大堆小棍子的长度,需要把他们拼成几根长度相等的大棍子,求大棍子的最短长度. Solution 经典搜索题,剪枝剪 ...

  10. POJ1011

    今天搞了一下传说中的经典搜索题——poj1011,果然里面充斥着各种巧妙的剪枝,做完之后回味一下还是感觉构思太巧妙,所以总结记录一下加深理解. 原题:http://poj.org/problem?id ...

随机推荐

  1. 利用war包和Tomcat镜像创建Web镜像

      from hub.c.163.com/library/tomcat:tag #代表以tomcat镜像为基础 MAINTAINER huhuixin 18611551449@163.com #代表所 ...

  2. 第三篇:Spark SQL Catalyst源码分析之Analyzer

    /** Spark SQL源码分析系列文章*/ 前面几篇文章讲解了Spark SQL的核心执行流程和Spark SQL的Catalyst框架的Sql Parser是怎样接受用户输入sql,经过解析生成 ...

  3. jdbc例子

    public class ConnMysql { public static void main(String[] args) throws ClassNotFoundException, SQLEx ...

  4. Pandas时间差(Timedelta)

    时间差(Timedelta)是时间上的差异,以不同的单位来表示.例如:日,小时,分钟,秒.它们可以是正值,也可以是负值.可以使用各种参数创建Timedelta对象,如下所示 - 字符串 通过传递字符串 ...

  5. python脚本5_求素数

    #求素数 #素数:只能被1和它自己整除 n = int(input('Please input a number >>>')) flag = False for i in range ...

  6. 在Windows Server 2012上安装SharePoint 2010 SP1

    现在很多企业的系统都开始用上了Windows 2012,最近公司需要建立一个门户系统,一开始就想到了微软的SharePoint2010,这玩意确实非常强悍,2008已经褪去,当然直接在Windows ...

  7. 十 web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令

    Scrapy框架安装 1.首先,终端执行命令升级pip: python -m pip install --upgrade pip2.安装,wheel(建议网络安装) pip install wheel ...

  8. idea结合git使用(正常项目开发过程中的使用)

    1.如何将本地项目代码提交到公司码云上面 1.项目右键 2. 在远处的remotes里面设置你的url

  9. vim编辑16进制

    你可以在vim中可以把文件转换为16进制来显示: :%!xxd 解释:把所有的行(%)用本地(!)的xxd程序打开. xxd本是linux下一个显示.编辑.转换二进制的命令. 返回正常显示: :%!x ...

  10. 关于微软C#中的CHART图表控件的简单使用

    最近公司项目要用到Chart图表控件,这是一个比较老的东西了,目前网络上似乎已经不太流行这个控件,但是只要配置了相关的属性,效果还是可以的.前前后后摸索了好久,接下来谈谈这个件控件最重要的几个属性. ...