博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA529 Addition Chains
阅读量:4486 次
发布时间:2019-06-08

本文共 1042 字,大约阅读时间需要 3 分钟。

题意:

一个与 nn 有关的整数加成序列 $<a_0,a_1,a_2,...,a_m>$ 满足以下四个条件:

1.$a_0=1$

2.$a_m=n$

3.$a_0<a_1<a_2<...<a_{m-1}<a_m$
4. 对于每一个 k(1≤k≤m) 都存在有两个整数 i 和 j(0≤i,j≤k-1,i和 j 可以相等 ) ,使得 $a_k=a_i+a_j$​
你的任务是:给定一个整数 nn ,找出符合上述四个条件的长度最小的整数加成序列。

如果有多个满足要求的答案,只需要输出任意一个解即可。

举个例子,序列<1,2,3,5> 和 <1,2,4,5> 均为 n=5 时的解。

 

一看就是搜索,于是爆搜。。。

然而,这是个迭代加深搜索。。。

剪枝如下:

1.优化搜索顺序
显然倒序枚举更有可能得到可行解。

让数大一些,尽可能接近n;

2.排除不可行解

我们发现,对于加成数列的要求还有一个,即 $a_m=n$

假设当前已经通过枚举得出了 $a_i$ ,正准备搜索第 i+1 个数。

考虑通过当前形势下到第 m 项可以得到的最大值,显然,$max(a_{i+1})=a_i+a_i=2×a_i$​

$max(a_{i+2})=a_{i+1}+a_{i+1}=2×a_{i+1}=4×a_i=2^2×a_i$​

故由递推可得

$max(a_m)=2^{m-i}×a_i$​

所以在进行对 i+1 个数的搜索前,计算一下 $max(a_m)$ 是否可以达到 n ,

如果达不到则无需进行下一步的搜索。

 

#include
#include
using namespace std;#define love_nmr 0int n;bool flag;int ans[10050];int maxx;inline void print(){ for(int i=1;i
=pos;i--) { for(int j=i;j>=1;j--) { int f=ans[depth]=ans[i]+ans[j]; for(int is=pos+1;is<=maxx;is++) f<<=1; if(f

 

转载于:https://www.cnblogs.com/olinr/p/9429690.html

你可能感兴趣的文章
linux中tomcat内存溢出解决办法 分类: 测试 ...
查看>>
jQuery $.each用法
查看>>
[Luogu 3902]Increasing
查看>>
clear语句处理不同类型的数据结果
查看>>
HDU 6118 度度熊的交易计划(费用流)
查看>>
UrlEncode编码/UrlDecode解码使用方法
查看>>
使用ubuntu作为web开发环境的一些感受
查看>>
easyui-datagrid 自适应列宽问题
查看>>
OO第一次总结
查看>>
VS2012发布网站详细步骤
查看>>
文件下载隐匿执行
查看>>
【导图控】各软件开发版本详解
查看>>
HDU 1533 Going home
查看>>
Extjs面板和布局初探
查看>>
箭头函数
查看>>
SharePoint【ECMAScript对象模型系列】-- 11. Enable/Disable Ribbon上的Button
查看>>
C#委托-怎样理解C#中“委托”的含义和用途
查看>>
Spring数据访问1 - 数据源配置及数据库连接池的概念
查看>>
setting.xml配置详解
查看>>
工作笔记——使用Jest时遇到的一些问题
查看>>