问题描述
给定一个1~N的排列a[i],每次将相邻两个数相加,得到新序列,再对新序列重复这样的操作,显然每次得到的序列都比上一次的序列长度少1,最终只剩一个数字。
例如:
3 1 2 4
4 3 6
7 9
16
现在如果知道N和最后得到的数字sum,请求出最初序列a[i],为1~N的一个排列。若有多种答案,则输出字典序最小的那一个。数据保证有解。
输入格式
第1行为两个正整数n,sum
输出格式
一个1~N的一个排列
样例输入
4 16
样例输出
3 1 2 4
#include<iostream>
#include<algorithm>//全排列函数必须包含文件
using namespace std;
int main()
{
int n, sum;
int b[20];//保留每种排列相加的结果
int j ;//记录每次相加的次数
cin >> n >> sum;
int* a = new int[n+1];
for (int i = 1; i < n + 1; i++)
a[i] = i;
do {
for (int i = 1; i < n + 1; i++)
{
b[i] = a[i];
}
j = n+1;
while (j > 1)//例如5个数相加4次得到最后的sum
{
for (int i = 1; i < j-1; i++)
{
b[i] += b[i + 1];
}
j--;
}
if (b[1] == sum) {
for (int i = 1; i < n + 1; i++)
{
cout << a[i]<<" ";
}
break;
}
} while (next_permutation(a+1, a + n+1));//排列数字的范围
}
关于全排列公式https://blog.csdn.net/weixin_51355192/article/details/123310669?spm=1001.2014.3001.5501