7-18 加法链
已知一个数列a0,a1……a
m
,其中a0=1,a
m
=n; a0<a1<a2<……<a
m
。对于每个k(1<=k<=m)满足ak=ai+aj(0<=i,j<=k−1),这里i与j可以相等。
现给定n的值,要求m的最小值(并不要求输出)及这个数列的值(可能存在多个数列,输出要求倒数第二个数尽可能大;当倒数第二数一样时,倒数第三数要尽可能大。依此类推)。
输入格式:
给定一个正整数n(即a
m
)。(1<n<10000)
输出格式:
输出满足条件的长度最小的数列(数间用一个空格隔开,最后一个数后有一个空格)。
输入样例:
18
输出样例:
1 2 4 8 16 18
#include<iostream>
#include<math.h>
using namespace std;
int a[1000], n, k;
bool f(int t)
{
if (t > k)
{
if (a[k] == n)
return true;
else
return false;
}
int b = pow(2, k - t+1);
if (a[t - 1] * b < n)
{
return false;
}
for (int i = t-1;i >=0;i--)
{
for (int j = i;j >=0;j--)
{
a[t] = a[i] + a[j];
if(f(t + 1))
return true;
}
}
return false;
}
int main()
{
cin >> n;
a[0] = 1;
k = 1;
while (1)
if (pow(2, k) < n)
k++;
else
break;
while (1) {
if (!f(1))
k++;
else
break;
}
for (int i = 0;i <=k;i++) {
cout << a[i] << " ";
}
}