Addition Chains

An addition chain for n is an integer sequence <a0, a1,a2,…,am> with the following four properties:

a0 = 1
am = n
a0 < a1 < a2 < … < am-1 < am
For each k (1 <= k <= m) there exist two (not necessarily different) integers i and j (0 <= i, j <= k-1) with ak = ai + aj

You are given an integer n. Your job is to construct an addition chain for n with minimal length. If there is more than one such sequence, any one is acceptable.

For example, <1, 2, 3, 5> and <1, 2, 4, 5> are both valid solutions when you are asked for an addition chain for 5.

Input

The input will contain one or more test cases. Each test case consists of one line containing one integer n (1 <= n <= 100). Input is terminated by a value of zero (0) for n.

Output

For each test case, print one line containing the required integer sequence. Separate the numbers by one blank.

Sample Input

 571215770

Sample Output

 1 2 4 51 2 4 6 71 2 4 8 121 2 4 5 10 151 2 4 8 9 17 34 68 77

题意:
给你一个数,问你从1开始,最少几个数能加到这个数,其中的一个数(除了1)必须能被其中的两个数相加得到。
思路:既然要最少的,那么这些数越大越好,所以咱们可以倒着搜。
代码:

#include<stdio.h>
#include<string.h>
int a[110];
int s,c[110],n;
void dfs(int x,int b)
{if(x>n||b>=s)return;if(x==n&&b<s){s=b;for(int i=0; i<s; i++)c[i]=a[i];return;}for(int i=b-1; i>=0; i--){a[b]=x+a[i];dfs(a[b],b+1);a[b]=0;}return;
}
int main()
{while(~scanf("%d",&n),n){memset(a,0,sizeof(a));memset(c,0,sizeof(c));s=110;if(n==1){printf("1\n");continue;}a[0]=1,a[1]=2;dfs(2,2);printf("%d",c[0]);for(int i=1;i<s;i++)printf(" %d",c[i]);printf("\n");}return 0;
}

Addition Chains相关推荐

  1. C++迭代加深搜索及其例题讲解—————Addition Chains

    前言: 学习算法时,一个关键的问题是什么时候来使用它.在一些搜索问题中,使用普通的DFS可能会让你把时间浪费在深度非常大而且答案不是最优的搜索过程上,甚至有的时候DFS搜索的深度是无穷的,而BFS虽说 ...

  2. POJ - 2248 Addition Chains(dfs+迭代加深)

    题目链接:点击查看 题目大意:我们规定加法链有如下特点: 现在给出一个数n,求该数的最短加法链 题目分析:这个题首先我们可以枚举所有可能性,并且进行适当的剪枝: 当前长度大于等于最优解时回溯 当前值等 ...

  3. Addition Chains(信息学奥赛一本通-T1443)

    [题目描述] 已知一个数列a0,a1--am,其中a0=1,am=n; a0<a1<a2<--<am−1<am.对于每个k(1≤k≤m)满足ak=ai+aj(0≤i,j≤ ...

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

    题目链接: poj2248 题目大意 给你一个数字n,你需要构造一个首项为1,末项为n的递增序列,并且这个序列的非首项的数字都能从它前面找到两项之和与之相等,前面的两项可以为同一项,即可重复,并且要让 ...

  5. 【poj2248】 Addition Chains(迭代加深)

    题目链接:http://poj.org/problem?id=2248 分析 当搜索树的分支随深度增大得很快的时候,最适合用迭代加深. 设置一个dep限制搜索深度,一旦到达dep立刻回溯. dep逐渐 ...

  6. POJ 2248 Addition Chains

    这一道题目用的仍然是DFS的方法.准确的说应该是Iterative Deepening Search, 关键在于理解,我们要找到的是最小长度,那么对应过来就是最小的深度.同时,还要理解, 如果当前深度 ...

  7. 1443:Addition Chains

    const int N=1e5+5;int n,m,t;int i,j,k;int minn=inf;int a[N],ans[N],len;void DFS(int step) //已经确定了 st ...

  8. 1443:【例题4】Addition Chains

    必不可少的题干 然而并没有什么鸟用 题干解析 没啥,暴搜,思路详见代码 剪枝 ps.不懂请留言 然而并不一定能及时被看见 剪枝1:迭代搜索,层数超了就返回. 剪枝2:上限判断,如若剩余数的最大值加一起 ...

  9. POJ 2248 算进 P110 Addition Chains

    满足如下条件的序列X(序列中元素被标号为1.2.3-m)被称为"加成序列": 1.X[1]=1 2.X[m]=n 3.X[1]<X[2]<-<X[m-1]< ...

最新文章

  1. 微信小程序扫二维码折中进入体验版
  2. 根据皮肤亮度来区分salmon和sea bass,这个比较好
  3. 推荐系统遇上深度学习(二十二):DeepFM升级版XDeepFM模型强势来袭!
  4. JMeter压测笔记
  5. 第一个Hibernate项目
  6. Oracle数据库管理员职责(二)
  7. Linux用户管理详解大结局(下)
  8. Articles for objccn.io. objc.io的完整、准确、优雅的中文翻译版本 http://objccn.io/
  9. 20191011每日一句
  10. latex附录中放python代码_LaTeX 里「添加程序代码」的完美解决方案
  11. python爬虫:用scrapy框架爬取链家网房价信息并存入mongodb
  12. vue项目打包成app
  13. 如何把多个文件夹里的文件提取出来?
  14. Windows10系统优化(批处理)
  15. 老照片瞬间修复神器!快帮你家的长辈恢复照片去吧
  16. MacBook Pro (M1 Pro芯片)使用安卓USB共享上网
  17. CPT208 人机设计 笔记
  18. 网络与协议2022 - Practice Questions - Block 1
  19. pocketSphinx Android 离线语音识别
  20. 《蹭课神器》Beta版使用说明

热门文章

  1. 进入注册表的一些常用命令
  2. 世界杯小组赛频繁爆冷?这或许是强队的谋略 一分钟带你了解2022卡塔尔世界杯赛制
  3. saltstack grain pillar
  4. Linux apache服务器(上)
  5. MySQL 的 20+ 条最佳实践
  6. Socket套接字通信 TCP UDP详解(网络通信)
  7. 使用NoteExpress做文献管理
  8. 储罐液位计算机控制系统,罐区测量流量计液位计工程设计仪表选型
  9. 网络共享计算机权限访问,共享电脑没有访问权限_共享电脑无访问权限
  10. OpenGL-纹理读取BMP图片-代码