题目
FJ 和 他的奶牛们在玩一个心理游戏。他们以某种方式写下1至N的数字(1<=N<=10)。 然后把相邻的数相加的到新的一行数。重复这一操作直至只剩一个数字。比如下面是N=4时的一种例子
3 1 2 4
4 3 6
7 9
16
在FJ回来之前,奶牛们开始了一个更难的游戏:他们尝试根据最后结果找到开始的序列。这已超过了FJ的思考极限。
写一个程序来帮助FJ吧
Input
N和最后的和
Output
满足要求的一行序列。若有多种情况,输出字典序最小的一种
Sample Input
4 16
Sample Output
3 1 2 4
DFS + next_permutation
#include <stdio.h>
#include <algorithm>
using namespace std;
int n,sum,p[15],a[15];
void dfs(int k,int b[]) //正向构建,直到n个数相加变成一个数
{
if(k==0)
{
if(b[0]==sum)
{
for(int i=0;i<n;i++)
printf("%d ",p[i]);
printf("\n");
exit(0); //一定要退出程序,不然会输出很多组答案
}
return;
}
for(int i=0;i<k-1;i++)
b[i]=b[i]+b[i+1];
dfs(k-1,b);
}
int main()
{
scanf("%d%d",&n,&sum);
for(int i=0;i<n;i++)
p[i]=i+1;
do
{
for(int i=0;i<n;i++) //一定要有重新创建一个数组,不能直接搜索p数组,因为while循环会改变p数组
a[i]=p[i];
dfs(n,a);
}while(next_permutation(p,p+n));
return 0;
}