问题描述
给定一个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
数据规模和约定
0<n<=10
分析:
AC代码:
百度之后知道这个数字三角形和杨辉三角的关系,输入4,16,输出3,1,2,4,四层杨辉三角的最后一行是(1,3,3,1),与输出序列对于相乘就是3x1+1x3+2x3+4x1=16,所以我们要写一个输出杨辉三角最后一行的函数(或者这里可以用杨辉三角的通式写),再写一个深搜回溯的函数。
在深搜的时候注意,出口是,搜完第n个数,序列和杨辉三角对应相乘的乘积之和刚好是输入的总和。
def YH_tri(row_num):#返回一个杨辉三角的最后一行
if row_num == 1:
result = [1]
else:
result = [[0 for i in range(0,row_num)]for