UVA 307 Sticks
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相关推荐
- Poj 1011 UVA - 307 Sticks
牛客网 poj 1011 题目: George took sticks of the same length and cut them randomly until all parts became ...
- Sticks UVA - 307(切木棍 线性区间dp,线性dp,区间思想。)
题目大意:将n节木棒接成m个长度相等的木条,要求木条的长度尽可能的短 Time limit 3000 ms OS Linux George took sticks of the sam ...
- 紫书 习题7-14 UVa 307(暴搜+剪枝)
这道题一开始我想的是在排序之后只在头和尾往中间靠近来找木块, 然后就WA, 事实证明这种方法是错误的. 然后参考了别人的博客.发现别人是直接暴搜, 但是加了很多剪枝, 所以不会超时. 我也想过这个做法 ...
- UVa 10003Cutting Sticks
这是一道区间dp的经典题目,定义状态为dp[i][j]为第i个切点到第j个切点的最小耗费,状态转移方程dp[i][j]=min{dp[i][k]+dp[k]][j]|i<k<j}.通过不断 ...
- π-Algorithmist分类题目(3)
原题网站:Algorithmist,http://www.algorithmist.com/index.php/Main_Page π-Algorithmist分类题目(3) Probability ...
- 紫书《算法竞赛入门经典》
紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...
- 提取了下刘汝佳推荐的题号...
今天闲来没事上uva oj提取了下刘汝佳推荐的acm题号,原始数据如下: Volume 0. Getting Started 10055 - Hashmat the Brave Warrior ...
- 训练指南第一部分解题报告
主要是提供训练指南第一部分解题报告链接,后面会持续更新中 307 - Sticks (DFS+剪枝) 11292 - Dragon of Loowater (贪心) 11729 - Commando ...
- 初学者acm的练习题指南
上机练习题参考题 忘了在哪找的啦~~希望对大家有帮助呦 <!--[if !supportLists]-->1. <!--[endif]-->Programming Bas ...
最新文章
- 【转载】linux2.6内核initrd机制解析
- 动态初始化一维数组详解
- oracle model 分组,【已解决】关于Oracle分组函数高级用法(按照N条分组并生成唯一号)...
- 李洪强iOS开发Swift篇—02_变量和常量
- 使用Struts2开发Java Web应用程序(目录)
- 纵览轻量化卷积神经网络:SqueezeNet、MobileNet、ShuffleNet、Xception
- 接口测试——测试用例执行
- Maven项目环境搭建实例.
- php 3.2 下载,PHPWind
- 获取当天开始时间以及结束时间
- 江苏小高考计算机什么时候考,2021江苏小高考时间 什么时候考试
- html文本只显示一行,如何让div中的文字只显示一行,多余的文字隐藏并加上省略号(超链接形式)...
- 使用Nginx反向代理豆瓣Api电影接口(解决微信小程序频繁调用api被关小黑屋)
- 知乎视频下载(爬虫)
- 提个醒。阿里内网最新发布“M8”级Java面试笔记,助力金三银四
- 身份证/异地身份证在北京办理的解决办法
- 接口获取行政区划代码_全国省市县行政区划分
- 旭日图(Sunburst)
- PPT中如何插入指定大小的矩阵
- 【速览】2021年全球及中国培育钻石行业发展现状及未来发展趋势分析[图]
热门文章
- RabbitMQ支持的消息模型
- DSP学习 -- 软件开机自启动
- axure7 地址选择_AxureRP8实战手册-案例7(形状:唯一选中项)
- 学习 Android O HIDL
- 实现AIDL接口的Binder连接池
- 在mysql中更改数据类型_如何在MySQL中更改列的数据类型?
- JZOJ 5941. 【NOIP2018模拟11.01】乘
- 计算机网络总线型结构优,计算机基础知识:计算机网络总线型拓扑结构的概述及优缺点...
- docker 容器安装conposer_docker学习笔记(二)docker-composer
- “如何写好科技论文之我见”结束语-如何写好科技论文之我见(十)