UVA_307

相当于重温了一下POJ 1011这个题目,剪枝在这个题目中显得尤为重要。

对于这道题而言,剪枝的策略一般有下面6个:

①先将木棒长度从大到小进行排序,这样便于后面的选择和操作,是后面一些剪枝算法的前提。

②在枚举原木棒长度时,枚举的范围为max与sum/2之间,如果这个区间内没有找到合适的长度,那么最后原木棒的长度只能是sum。

③枚举的原木棒的长度只能是sum的约数。

④在深搜过程中,如果当前木棒和前一个木棒的长度是一样的,但是前一个木棒没有被选上,那么这个木棒也一定不会被选上。

⑤在深搜过程中,如果当前是在拼一根新木棒的第一截,但如果把可用的最长的一根木棒用上后不能拼成功的话,那么就不用再试后面的木棒了,肯定是前面拼的过程出了问题。

⑥在深搜过程中,如果当前可用的木棒恰好能补上一根原木棒的最后一截,但用它补上之后却不能用剩下的木棒完成后续的任务,那么也不用再试后面的木棒了,肯定是前面拼的过程出了问题。

#include<stdio.h>#include<string.h>#include<stdlib.h>int sum,N,n,L,a[100],vis[100];int cmp(const void *_p,const void *_q){int *p=(int *)_p;int *q=(int *)_q;return *q-*p;}int dfs(cur,complete,len){int i;if(len==L)    {        complete++;if(complete==N)return 1;else         {for(cur=0;vis[cur];cur++);            vis[cur]=1;if(dfs(cur+1,complete,a[cur]))return 1;            vis[cur]=0;        }    }else    {for(i=cur;i<n;i++)if(!vis[i]&&a[i]<=L-len)                {if(i!=0&&a[i]==a[i-1]&&!vis[i-1])continue;                vis[i]=1;if(dfs(i+1,complete,len+a[i]))return 1;                vis[i]=0;if(a[i]==L-len)return 0;            }    }return 0;}int main(){int i,j,k,max;while(1)    {        scanf("%d",&n);if(n==0)break;        sum=max=0;for(i=0;i<n;i++)        {            scanf("%d",&a[i]);if(a[i]>max)                max=a[i];            sum+=a[i];        }        qsort(a,n,sizeof(a[0]),cmp);        memset(vis,0,sizeof(vis));for(L=max;L<=sum/2;L++)        {if(sum%L!=0)continue;            N=sum/L;if(dfs(0,0,0))break;        }if(L>sum/2)            printf("%d\n",sum);else            printf("%d\n",L);    }return 0;    }

  

转载于:https://www.cnblogs.com/staginner/archive/2011/09/08/2171329.html

UVA 307 Sticks相关推荐

  1. Poj 1011 UVA - 307 Sticks

    牛客网 poj 1011 题目: George took sticks of the same length and cut them randomly until all parts became ...

  2. Sticks UVA - 307(切木棍 线性区间dp,线性dp,区间思想。)

    题目大意:将n节木棒接成m个长度相等的木条,要求木条的长度尽可能的短 Time limit     3000 ms OS     Linux George took sticks of the sam ...

  3. 紫书 习题7-14 UVa 307(暴搜+剪枝)

    这道题一开始我想的是在排序之后只在头和尾往中间靠近来找木块, 然后就WA, 事实证明这种方法是错误的. 然后参考了别人的博客.发现别人是直接暴搜, 但是加了很多剪枝, 所以不会超时. 我也想过这个做法 ...

  4. UVa 10003Cutting Sticks

    这是一道区间dp的经典题目,定义状态为dp[i][j]为第i个切点到第j个切点的最小耗费,状态转移方程dp[i][j]=min{dp[i][k]+dp[k]][j]|i<k<j}.通过不断 ...

  5. π-Algorithmist分类题目(3)

    原题网站:Algorithmist,http://www.algorithmist.com/index.php/Main_Page π-Algorithmist分类题目(3) Probability ...

  6. 紫书《算法竞赛入门经典》

    紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...

  7. 提取了下刘汝佳推荐的题号...

    今天闲来没事上uva oj提取了下刘汝佳推荐的acm题号,原始数据如下: Volume 0. Getting Started    10055 - Hashmat the Brave Warrior ...

  8. 训练指南第一部分解题报告

    主要是提供训练指南第一部分解题报告链接,后面会持续更新中 307 - Sticks  (DFS+剪枝) 11292 - Dragon of Loowater (贪心) 11729 - Commando ...

  9. 初学者acm的练习题指南

    上机练习题参考题 忘了在哪找的啦~~希望对大家有帮助呦 <!--[if !supportLists]-->1.    <!--[endif]-->Programming Bas ...

最新文章

  1. 【转载】linux2.6内核initrd机制解析
  2. 动态初始化一维数组详解
  3. oracle model 分组,【已解决】关于Oracle分组函数高级用法(按照N条分组并生成唯一号)...
  4. 李洪强iOS开发Swift篇—02_变量和常量
  5. 使用Struts2开发Java Web应用程序(目录)
  6. 纵览轻量化卷积神经网络:SqueezeNet、MobileNet、ShuffleNet、Xception
  7. 接口测试——测试用例执行
  8. Maven项目环境搭建实例.
  9. php 3.2 下载,PHPWind
  10. 获取当天开始时间以及结束时间
  11. 江苏小高考计算机什么时候考,2021江苏小高考时间 什么时候考试
  12. html文本只显示一行,如何让div中的文字只显示一行,多余的文字隐藏并加上省略号(超链接形式)...
  13. 使用Nginx反向代理豆瓣Api电影接口(解决微信小程序频繁调用api被关小黑屋)
  14. 知乎视频下载(爬虫)
  15. 提个醒。阿里内网最新发布“M8”级Java面试笔记,助力金三银四
  16. 身份证/异地身份证在北京办理的解决办法
  17. 接口获取行政区划代码_全国省市县行政区划分
  18. 旭日图(Sunburst)
  19. PPT中如何插入指定大小的矩阵
  20. 【速览】2021年全球及中国培育钻石行业发展现状及未来发展趋势分析[图]

热门文章

  1. RabbitMQ支持的消息模型
  2. DSP学习 -- 软件开机自启动
  3. axure7 地址选择_AxureRP8实战手册-案例7(形状:唯一选中项)
  4. 学习 Android O HIDL
  5. 实现AIDL接口的Binder连接池
  6. 在mysql中更改数据类型_如何在MySQL中更改列的数据类型?
  7. JZOJ 5941. 【NOIP2018模拟11.01】乘
  8. 计算机网络总线型结构优,计算机基础知识:计算机网络总线型拓扑结构的概述及优缺点...
  9. docker 容器安装conposer_docker学习笔记(二)docker-composer
  10. “如何写好科技论文之我见”结束语-如何写好科技论文之我见(十)