poj1011(DFS+剪枝)
题目链接:https://vjudge.net/problem/POJ-1011
题意:给定n(<=64)条木棍的长度(<=50),将这些木棍刚好拼成长度一样的若干条木棍,求拼出的可能的最小长度。
思路:经典的DFS剪枝题,这道题的剪枝技巧很关键。
数据不大,可以想到枚举木棍所有可能的长度,然后利用dfs来查找所有可能的搭配情况,dfs的参数len表示当前的木棍长度,rest表示还需要的长度,pos表示当前搜到的下标,num表示原始木棍中剩余没有匹配的数量,搜索的终止条件为rest==0&&num==0,但直接这样做还是会超时,这道题有许多的剪枝技巧:
1. 将序列降序排序,方便后面的剪枝。
2. 枚举的范围是[Max,sum/2],其中Max为序列中的最大值,sum为序列和。
3. 可能的长度只能是sum的约数。
4. 深搜时,如果在寻找一条新木棍时使用了剩余木棍中最长的也不能满足条件,则直接返回。因为最长的一根一定要使用,不用的话后面也一直用不到,最终是无法成功匹配的。对应代码中的if(!rest)中的语句。
5. 深搜时,如果当前木棍刚好使正在凑的木棍形成新木棍,但也不满足条件时,直接返回。比如你现在是3,使用3刚好能凑出一根新木棍,但使用之后后面仍无法满足条件,现在即使后面存在1 2,你使用1 2来凑出剩下的3也一定不能满足条件,因为1 2两条木棍比3更灵活,使用1 2都无法成功的话使用3更无法成功。对应代码if(a[i]==rest) break。
6. 当前木棍长为x,使用x无法满足条件时,则可直接跳过后面所有长为x的木棍。对应代码while(a[i+1]==a[i]) ++i。
AC代码:
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- using namespace std;
- int n,a[],vis[],ans;
- bool cmp(int x,int y){
- return x>y;
- }
- bool dfs(int len,int rest,int pos,int num){
- if(!rest&&!num){
- ans=len;
- return true;
- }
- if(!rest){
- rest=len;
- for(int i=;i<n;++i){
- if(vis[i]) continue;
- vis[i]=;
- if(dfs(len,rest-a[i],i+,num-))
- return true;
- vis[i]=;
- return false;
- }
- }
- for(int i=pos;i<n;++i){
- if(vis[i]) continue;
- if(a[i]<=rest){
- vis[i]=;
- if(dfs(len,rest-a[i],i+,num-))
- return true;
- vis[i]=;
- if(a[i]==rest) break;
- while(a[i+]==a[i]) ++i;
- }
- }
- return false;
- }
- int main(){
- while(scanf("%d",&n),n){
- int sum=,flag=;
- for(int i=;i<n;++i){
- scanf("%d",&a[i]);
- sum+=a[i];
- }
- sort(a,a+n,cmp);
- memset(vis,,sizeof(vis));
- for(int i=a[];i<=sum/;++i){
- if(sum%i==){
- if(dfs(i,i,,n)){
- flag=;
- break;
- }
- }
- }
- if(flag)
- printf("%d\n",ans);
- else
- printf("%d\n",sum);
- }
- return ;
- }
poj1011(DFS+剪枝)的更多相关文章
- *HDU1455 DFS剪枝
Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- POJ 3009 DFS+剪枝
POJ3009 DFS+剪枝 原题: Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16280 Acce ...
- poj 1724:ROADS(DFS + 剪枝)
ROADS Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10777 Accepted: 3961 Descriptio ...
- DFS(剪枝) POJ 1011 Sticks
题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...
- DFS+剪枝 HDOJ 5323 Solve this interesting problem
题目传送门 /* 题意:告诉一个区间[L,R],问根节点的n是多少 DFS+剪枝:父亲节点有四种情况:[l, r + len],[l, r + len - 1],[l - len, r],[l - l ...
- HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)
Counting Cliques Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- HDU 5937 Equation 【DFS+剪枝】 (2016年中国大学生程序设计竞赛(杭州))
Equation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- LA 6476 Outpost Navigation (DFS+剪枝)
题目链接 Solution DFS+剪枝 对于一个走过点k,如果有必要再走一次,那么一定是走过k后在k点的最大弹药数增加了.否则一定没有必要再走. 记录经过每个点的最大弹药数,对dfs进行剪枝. #i ...
- poj 1011 Sticks (DFS+剪枝)
Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 127771 Accepted: 29926 Descrip ...
随机推荐
- 接口headers
接口headers from-data header: { 'Content-Type':'application/json'}, header: { 'Content-Type':'appl ...
- 上一个树形菜单的改进,增添了数据绑定功能而非仅仅的jq特效
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- 缓存区溢出之slmail fuzzing
这是我们的实验环境 kali 172.18.5.118smtp windows2003 172.18.5.117 pop3 110 smtp 25 本机 172.18.5.114 已经知道slma ...
- 【每日一包0012】to-camel-case,to-no-case,to-space-case
github地址:https://github.com/ABCDdouyaer/a_pack_per_day_NO.1 to-camel-case 将被其他符号分割的字符串转换为驼峰形式的字符串 用法 ...
- Java密码处理
- 菜鸟requireJS教程---2、基本知识
菜鸟requireJS教程---2.基本知识 一.总结 一句话总结: 1.requireJS中的api就define(比如定义自己的函数)和require 2.requireJS使用的话就是配置req ...
- 全面解读php-函数
一.静态变量 二.函数的参数 三.函数的引用返回 四.外部文件的导入 五.内置函数 1.时间日期函数 2.IP处理函数 3.打印函数: 分类 函数名 说明 语言结构 print() 只能打印一个变量 ...
- XPath2Doc,一个半自动采集网页生成Word Docx文件的工具,带企查查和天眼查模板
原始出处:https://www.cnblogs.com/Charltsing/p/XPath2Doc.html 很多人需要从网站采集一些数据填写Word模板,手工操作费时费力还容易出错,所以我给朋友 ...
- [MVC HtmlHelper简单了解]
HtmlHelper用来在视图中显示Html控件,简化代码,使用方便!,降低了View视图中的代码复杂度!可以更快速的完成工作! 以下是一些常用 的html标签 辅助方法 使用HTML辅助方法输出 ...
- Electron对JQuery的支持问题
最近在了解Electron框架写应用,偶然发现在html中使用<script src="./jquery.js"></script>这种方式引入JQuery ...