poj1011Sticks
传说中的poj必做50题之中的一个……
这是个传说中的搜索,
一開始以为,
仅仅要棒子加起来等于如果的原始长度,
那么这几根选择的棒子就不用管了,
结果卡在第一个例子……
看了一下,发现,
代码把1,2,1,2合成一个棒子,
这样其它就凑不成3根长度为6的棒子了,
写了半天,发现思路错了,
这个问题不知道怎样解决。
參考了下面地址的结题报告:
http://blog.csdn.net/lyy289065406/article/details/6647960
找到了一个解决的方法,
就是当合成了一个新的棒子的时候,
就又一次从第一个棒子開始枚举,
用没实用过的棒子,開始合成新的棒子。
写好代码之后,各种TLE……
于是又參考了上面那个解题报告,
找了个剪枝的办法,
就是假设碰到用某个棒子为第一个棒子合成新棒子
的时候,无法得到我想要的那种棒子,
就直接退栈并返回一个0表示这样不行,
写好之后,结果还是TLE,
于是继续剪了个枝
就是一開始给棒子递增排个序,
然后假设在合成棒子的中途发现
合成失败,用这根棒子得不到想要的那种棒子,
就把这个棒子标记一下,
假设在这次合成中再次碰到一样长度的棒子,
就直接舍弃。
又写好了……还是TLE。。。
我就不明确了……
再TLE,我真的没办法了。
又參考了结题报告,
发现给棒子递减排序就能够,
想了一下为毛,
是这种,由于优先增加长度较长的棒子,
更easy在比較少的次数里合成想要的那种棒子。
我的代码例如以下,欢迎讨论:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int stick[74],num_stk,sum_len;
bool used[74];
bool cmp(int a,int b)
{
return a>b;
}
void init()
{
int i;
sum_len=0;
for(i=0;i<num_stk;i++)
{
scanf("%d",&stick[i]);
sum_len+=stick[i];
}
}
bool dfs(int s,int nlen,int nnum,int olen)
{
int i,x=-1;
if(nnum==num_stk)
return 1;
for(i=s;i<num_stk;i++)
{
if(used[i]||stick[i]==x||nlen+stick[i]>olen)
continue;
used[i]=1;
if(nlen+stick[i]<olen)
{
if(dfs(i+1,nlen+stick[i],nnum+1,olen))
return 1;
}
else
{
if(dfs(0,0,nnum+1,olen))
return 1;
}
x=stick[i];
used[i]=0;
if(nlen==0)
return 0;
}
return 0;
}
void work()
{
int i;
memset(used,0,sizeof(used));
sort(stick,stick+num_stk,cmp);
for(i=stick[0];i+i<=sum_len;i++)
{
if(sum_len%i==0&&dfs(0,0,0,i))
{
printf("%d\n",i);
return;
}
}
printf("%d\n",sum_len);
}
int main()
{
while(scanf("%d",&num_stk)&&num_stk!=0)
{
init();
work();
}
}
poj1011Sticks的更多相关文章
- 【深度搜索+剪枝】POJ1011-Sticks
深搜部分和之前的POJ2362差不多,只是有几处需要额外的剪枝. [思路]排序后从最短木棒开始搜索至木棒长总和,如果木棒长总和sum能整除当前棒长,则进入深搜. [剪枝]先前POJ2362的剪枝部分不 ...
- DFS(7)——poj1011Sticks
一.题目回顾 题目链接:Sticks 题意:给出一定数量的小木棒的长度,它是由等长的若干木棒随意砍断所得到的.对于给定的一组小木棒,请求出原始木棒的最小长度. 二.解题思路 DFS+剪枝 本题剪枝不到 ...
随机推荐
- nice Validator参考
快速上手 例1. DOM传参 1. 要验证一个表单,只需要给字段绑定规则“data-rule”就可以了2. 字段可以有多条规则,规则之间用分号(;)分隔3. js初始化不是必要的,只要是字段并且带有“ ...
- 安装Tomcat指定JDK(转)
一.应用实例 一般情况下一台服务器只跑一个业务,那么就直接配置一套环境,设置好Java环境变量即可.某些时候一台服务器上会安装多个业务,而且各个业务需要的JDK版本各不相同,或者为了使业务独立开来,需 ...
- Citrix XenApp6.5 另类发布文档
快捷方式.文档发布 第一种方式: 1. 创建快捷方式 2. 创建批处理文件(例如:lnk.bat),并输入以下内容: Start c:\users\public\desktop\adobe ...
- CUSPARSE 第三章 CUSPARAE索引和数据格式
(纯属自学笔记,部分翻译,不会翻译的不翻译) 3.1 索引基本格式 该函数库支持 zero- and one-based 索引. The index base 是通过 cusparseIndexBas ...
- Android性能检测--traceview工具各个参数的意思
Android性能检测 traceview的使用方法 1. 把android-sdk-windows\tools路径加到Path当中 2. 编写测试代码: package com.wwj.tracev ...
- c#--foreach遍历的用法与split的用法
一. foreach循环用于列举出集合中所有的元素,foreach语句中的表达式由关键字in隔开的两个项组成.in右边的项是集合名,in左边的项是变量名,用来存放该集合中的每个元素. 该循环 ...
- SQLyog 注册码
用户名: 随意填写 秘钥: ccbfc13e-c31d-42ce-8939-3c7e63ed5417a56ea5da-f30b-4fb1-8a05-95f346a9b20ba0fe8645-3916- ...
- JVM调优总结(六)-分代垃圾回收详述2
分代垃圾回收流程示意 选择合适的垃圾收集算法 串行收集器 用单线程处理所有垃圾回收工作,因为无需多线程交互,所以效率比较高.但是,也无法使用多处理器的优势,所以此收集器适合单处理器机器.当然,此收集器 ...
- Windows Azure 安全最佳实践 - 第 7 部分:提示、工具和编码最佳实践
在撰写这一系列文章的过程中,我总结出了很多最佳实践.在这篇文章中,我介绍了在保护您的WindowsAzure应用程序时需要考虑的更多事项. 下面是一些工具和编码提示与最佳实践: · 在操作系统上运行 ...
- MFC + CxImage 实现自绘半透明按钮
环境:VS2008 + CxImage btn.h [cpp] view plaincopyprint? #pragma once // CBtn #include "ximage/xima ...