FJ and his cows enjoy playing a mental game. They write down the numbers from 1 to N (1 <= N <= 10) in a certain order and then sum adjacent numbers to produce a new list with one fewer number. They repeat this until only a single number is left. For example, one instance of the game (when N=4) might go like this:
Write a program to help FJ play the game and keep up with the cows.
3 1 2 4 4 3 6 7 9 16Behind FJ's back, the cows have started playing a more difficult game, in which they try to determine the starting sequence from only the final total and the number N. Unfortunately, the game is a bit above FJ's mental arithmetic capabilities.
Write a program to help FJ play the game and keep up with the cows.
Line 1: Two space-separated integers: N and the final sum.
Line 1: An ordering of the integers 1..N that leads to the given sum. If there are multiple solutions, choose the one that is lexicographically least, i.e., that puts smaller numbers first.
4 16
3 1 2 4
Explanation of the sample:
There are other possible sequences, such as 3 2 1 4, but 3 1 2 4 is the lexicographically smallest.
题意:1.输入一个N,结果被限制为:只能是1到N的整数,而且只能有N个整数(即限定范围,又限定数量)
2.要求求出这N个数的排列,使他们按照类似杨辉三角型的规则进行相加后,结果为sum
题解:next_permutation()全排列函数的运用直至1~n中有一种排列使得最后结果为sum就结束
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n;
int sum;
int a[15];
int arr[15][15];
while(cin>>n>>sum){
for(int i=0;i<n;i++)
a[i]=i+1;
do{
for(int j=0;j<n;j++)
arr[0][j]=a[j];
for(int i=1;i<n;i++)
for(int j=0;j<n-i;j++)
arr[i][j]=arr[i-1][j]+arr[i-1][j+1];
if(arr[n-1][0]==sum)
break;
}while(next_permutation(a,a+n));
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
return 0;
}