题目描述:

一个与 n 有关的整数加成序列 < a0 , a1 , a2 ...am> 满足一下四个条件:

1.a0=1

2.am=n

3.a0<a1<a2<...<am

4.对于每个( 1≤k≤m )都存在有两个整数 i 和 j (0 ≤ i , j  ≤ k - 1 , i 和 j可以相等),使得ak=ai+aj

你的任务是:给定一个整数 n ,找出符合上述四个条件的长度最小的整数加成序列。如果有多个满足要求的答案,只需要输出任意一个解即可。

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

输入格式:

多组数据,每行给定一个正整数n。输入以0结束。

输出格式:

对于每组数据,输出满足条件的长度最小的数列。

样例输入:

5

7

12

15

77

0

样例输出:

1 2 4 5

1 2 4 6 7

1 2 4 8 12

1 2 4 5 10 15

1 2 4 8 9 17 34 68 77

思路:

  看了书之后才知道这题是用搜索。(蒟蒻的我只会暴力枚举)

  那么怎么搜索又成为了一个问题——其实可以依次搜索一位k, 枚举之前的i, j, 把a[i] + a[j] 加到a[k]的位置上, 然后接着搜索;

  这样还是AC不了。

  这时就需要考虑剪枝。

  对于剪枝:

  ①尽量从达到小枚举i,j让序列的数尽快逼近n;(贪心思想)

  ②为了不重复搜索,用一个bool数组存a[i] + a[j] 是否已经被搜过;

AC代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<stack>
#include<queue>
#include<deque>
#include<vector>
#include<map>
#include<set>
using namespace std;
#define maxn 1100
int n,ans,a[maxn];
bool use[maxn];
inline int read()
{
char kr=;
char ls;
for(;ls>''||ls<'';kr=ls,ls=getchar());
int xs=;
for(;ls>=''&&ls<='';ls=getchar())
{
xs=xs*+ls-;
}
if(kr=='-') xs=-xs;
return xs;
}
inline bool dfs(int stp)
{
memset(use,,sizeof(use));
if(stp>ans)
{
if(a[ans]==n) return true;
else return false;
}
for(register int i=stp-;i>=;i--)
{
for(register int j=i;j>=;j--)
{
if(a[i]+a[j]>n) continue;
if(!use[a[i]+a[j]])
{
if(a[i]+a[j]<=a[stp-]) return false;
use[a[i]+a[j]]=true;
a[stp]=a[i]+a[j];
if(dfs(stp+)) return true;
a[stp]=;
use[a[i]+a[j]]=false;
}
}
}
}
int main()
{
while(n=read(),n!=EOF)
{
if(n==) return ;
if(n==)
{
printf("1\n");
continue;
}
if(n==)
{
printf("1 2\n");
continue;
}//特判一下上述三种情况
a[]=;a[]=;
for(ans=;!dfs();ans++);//搜索记录
for(register int i=;i<=ans;i++)
{
printf("%d ",a[i]);
}
printf("\n");
memset(a,,sizeof(a));
}
return ;
}

洛谷谜一般的评测TLE,在POJ上提交AC了。

Addition Chains的更多相关文章

  1. UVA 529 Addition Chains(迭代搜索)

      Addition Chains  An addition chain for n is an integer sequence  with the following four propertie ...

  2. [POJ2248] Addition Chains 迭代加深搜索

    Addition Chains Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5454   Accepted: 2923   ...

  3. 1443:【例题4】Addition Chains

    1443:[例题4]Addition Chains 题解 注释在代码里 注意优化搜索顺序以及最优化剪枝 代码 #include<iostream> #include<cstdio&g ...

  4. poj 2248 Addition Chains (迭代加深搜索)

    [题目描述] An addition chain for n is an integer sequence with the following four properties: a0 = 1 am ...

  5. 「一本通 1.3 例 4」Addition Chains

    Addition Chains 题面 对于一个数列 \(a_1,a_2 \dots a_{m-1},a_m\) 且 \(a_1<a_2 \dots a_{m-1}<a_m\). 数列中的一 ...

  6. UVA 529 - Addition Chains,迭代加深搜索+剪枝

    Description An addition chain for n is an integer sequence  with the following four properties: a0 = ...

  7. [POJ 2248]Addition Chains

    Description An addition chain for n is an integer sequence with the following four properties: a0 = ...

  8. Addition Chains POJ - 2248 (bfs / dfs / 迭代加深)

    An addition chain for n is an integer sequence <a0, a1,a2,...,am=""> with the follow ...

  9. C++解题报告 : 迭代加深搜索之 ZOJ 1937 Addition Chains

    此题不难,主要思路便是IDDFS(迭代加深搜索),关键在于优化. 一个IDDFS的简单介绍,没有了解的同学可以看看: https://www.cnblogs.com/MisakaMKT/article ...

  10. POJ 2245 Addition Chains(算竞进阶习题)

    迭代加深dfs 每次控制序列的长度,依次加深搜索 有几个剪枝: 优化搜索顺序,从大往下枚举i, j这样能够让序列中的数尽快逼近n 对于不同i,j和可能是相等的,在枚举的时候用过的数肯定不会再被填上所以 ...

随机推荐

  1. Ubuntu 为 root 帐号开启 SSH 登录

    1. 修改 root 密码sudo passwd root 2. 以其他账户登录,通过 sudo nano 修改 /etc/ssh/sshd_config :xxx@ubuntu:~$ su - ro ...

  2. docker local registry server gave HTTP response to HTTPS client

    server gave HTTP response to HTTPS client报错是在insecure_registry中加入了http前缀,如果本地registry不是https的 就不要加任何 ...

  3. ogg 12.3 中 format release的变化

    Non-CDB databases with compatibility set to 12.1, FORMAT RELEASE 12.2 or above is supported. Non-CDB ...

  4. self: 限制并发量asyncio

    #coding:utf-8 import time,asyncio a=time.time() id=1 async def hello(id,semaphore): async with semap ...

  5. 您的windows许可证即将过期 win10的解决办法

    出现这个错误是因为安装的版本不是正版系统,每隔一段时间需要激活 这次激活也费了一些时间,记录如下希望能对大家有所帮助 (1)首先可以查看自己的许可什么什么时候会过期 windows+R调出命令运行窗口 ...

  6. Cannot resolve reference to bean 'sqlSessionFactory' while setting bean

    今天下载公司以前的一个项目,要和现在的项目进行整合,下载一切顺利,但在开发机器上一跑,憋了. 有两种日志,两种报错:一个是cannot resolve reference to bean 'sqlSe ...

  7. Spring Boot 2 (六):使用 Docker 部署 Spring Boot 开源软件云收藏

    Spring Boot 2 (六):使用 Docker 部署 Spring Boot 开源软件云收藏 云收藏项目已经开源3年多了,作为当初刚开始学习 Spring Boot 的练手项目,使用了很多当时 ...

  8. NPM安装步骤

    一.使用之前,我们先来掌握3个东西是用来干什么的. npm: Nodejs下的包管理器. webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资 ...

  9. linux有趣的命令screen

    screen类似一个容器, 可以把当前前台运行的应用shell窗口关闭而不影响运行, 跟后后nohup有点相似, 不过我觉得比nohup还好用 用法1: screen 然后会弹出一个新的shell窗口 ...

  10. python简说(二十二)写日志

    分四个级别 import nnloglog = nnlog.Logger('book_server.log') log.debug('xxx值是什么')log.info('调用了什么xxx')log. ...