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+剪枝 本题剪枝不到 ...
随机推荐
- (step8.2.2)hdu 2509(Be the Winner——简单博弈)
题目大意:输入一个整数n,表示火柴堆数(原题其实指的是苹果堆数,但是为了尽量与模板保持一致,所以在这里理解为火柴堆数....其实理解为什么都没关系, 重要的是,理解就行....).在接下来的一行中,有 ...
- pop,墨刀,快现、justinmind 、Axure
原型设计软件 墨刀:https://modao.cc Justinmind: http://www.zhihu.com/question/26662368/answer/33586218 http:/ ...
- 第一个Spark程序
1.Java下Spark开发环境搭建(from http://www.cnblogs.com/eczhou/p/5216918.html) 1.1.jdk安装 安装oracle下的jdk,我安装的是j ...
- Python中打印列表的序号和内容
==>the start 最近作业里要用到遍历打印出列表中的序号和内容,我刚开始用了个很笨的方法来写,后来老师说可以使用enumerate()函数,所以我就特意研究了下. 先看我之前用的笨方法: ...
- html5游戏开发--"动静"结合用地图块拼成大地图 & 初探lufyl
一.前言 本次教程将向大家讲解如何用html5将小地图块拼成大地图,以及如何用现有的高级html5游戏开发库件lufylegend.js开发游戏. 首先让我们来了解了解如何用html5实现动画 ...
- iPhone应用程序开发基础之一: IBOutlet与IBAction
在图形界面编程时,解决的第一问题就是如何将静态界面与代码关联起来,或者说是代码如何与界面上的对象 通信, 代码如何操作界面上的对象.在iPhone平台上,引入了IBOutlet与IBAction.通过 ...
- 先有Delphi内存对象,后有句柄(如果需要的话),最后再显示
在设计期放上一个Panel1和Button1,然后设置Panel1.Visible:=False 这时候执行: procedure TForm1.Button4Click(Sender: TObjec ...
- DELPHI语法基础学习笔记-Windows 句柄、回调函数、函数重载等(Delphi中很少需要直接使用句柄,因为句柄藏在窗体、 位图及其他Delphi 对象的内部)
函数重载重载的思想很简单:编译器允许你用同一名字定义多个函数或过程,只要它们所带的参数不同.实际上,编译器是通过检测参数来确定需要调用的例程.下面是从VCL 的数学单元(Math Unit)中摘录的一 ...
- Troubleshooting:oVirt-engine
问题:执行./create_db_devel.sh -u postgres创建数据库时出错 描述: [root@localhost dbscripts]# ./create_db_devel.sh - ...
- 它们偷偷干了啥?教你监督APP的运行
由于Android系统的开放性,很多APP都会在后台运行各种我们不知道的权限,不仅泄露我们隐私,也给系统本身带来极大安全隐患.而且现在很普遍的是,在安装APP时它总会索取特别多的权限,又是拍照又是地理 ...