传说中的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的更多相关文章

  1. 【深度搜索+剪枝】POJ1011-Sticks

    深搜部分和之前的POJ2362差不多,只是有几处需要额外的剪枝. [思路]排序后从最短木棒开始搜索至木棒长总和,如果木棒长总和sum能整除当前棒长,则进入深搜. [剪枝]先前POJ2362的剪枝部分不 ...

  2. DFS(7)——poj1011Sticks

    一.题目回顾 题目链接:Sticks 题意:给出一定数量的小木棒的长度,它是由等长的若干木棒随意砍断所得到的.对于给定的一组小木棒,请求出原始木棒的最小长度. 二.解题思路 DFS+剪枝 本题剪枝不到 ...

随机推荐

  1. Krita 3.0 发布,KOffice 的图像处理器(刺激一下自己的神经)

    Krita 3.0 发布了,经历了一年多的开发,动画功能被集成到Krita核心,改善了绘画功能,可及时预览绘画结果,该版本也是最新移植到QT的版本. 查看完整发布说明,可以点击这里. 下载地址: Wi ...

  2. springMVC用法 以及一个简单的基于springMVC hibernate spring的配置

    替代struts 1  web.xml中配置springmvc中央控制器 <?xml version="1.0" encoding="UTF-8"?> ...

  3. poj 2356鸽笼原理水题

    关于鸽笼原理的知识看我写的另一篇博客 http://blog.csdn.net/u011026968/article/details/11564841 (需要说明的是,我写的代码在有答案时就输出结果了 ...

  4. [置顶] hdu3018解题报告--也是白话几笔画学习总结

    1.题意 2.分析难点(结合图形) 1.首先说说题意吧...题意很简单...但是一开始很菜的我就很迷惑..在想啊...题目怎么就会有没有连接边的点呢....因为你每次给出一条边..就把 a,b连接啦. ...

  5. cocos2dx 3.0 飞机大战

    因为课程须要.然后又水平有限.所以写了个飞机大战.加上不会画画.所以图片资源也是从微信apk解压出来的,设计思路參考的偶尔e网事. 闲话不说.先讲一下设计.大体上一共分为3个场景.场景以下是Layer ...

  6. Smarty - 安装+入门小例子

    环境: smarty 1.在http://www.smarty.net/download下载最新smarty包,window选择zips,linux下选择tar.gz.以windows为例,下载后解压 ...

  7. 如何将一个Jsp网站打包发布(发布为War文件)

    链接地址:http://blog.csdn.net/luohuijun619/article/details/4867131 版权声明:本文为博主原创文章,未经博主允许不得转载. 网站做完后,并不是直 ...

  8. Can't connect to MySQL server on 'XXX' (13)

    出现can't connect to MySQL server using '' (13)的错误,结果是 SELinux 不让 httpd 访问外网,一开始还以为是iptables造成的,关闭之后发现 ...

  9. J2EE基础篇——十三个规范

    背景: 1.企业级应用框架的需求,在很多企业级应用中.比如数据库连接.邮件服务.事务处理等都是一些通用企业需求模块,这些模块假设每次在开发中都由开发者来完毕的话,将会造成开发周期长和代码可靠性差等问题 ...

  10. MSSQL - 创建新用户

    1.首先使用Windows身份验证登陆. 2.然后一次打开:安全性--->登录名.右键登录名,点击新建登录名. 3.常规选项卡下:填写登录名.选择SQL Server身份验证,填写登录名密码.取 ...