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.
4 16
3 1 2 4
There are other possible sequences, such as 3 2 1 4, but 3 1 2 4 is the lexicographically smallest.
题意:就是给你一个n和sum,wenni 1~n的这些数中,怎么排列,能通过如上图的方式得到的和与sum相同。
思路:当是A 就得A
若是 A B 若是 A B C A B C D
A+B A+B B+C A+B B+C C+D
A+B+B+C A+B+B+C B+C+C+D
A+B+B+B+C+C+C+D
依次类推,得到几个数就分别乘以第几层的杨辉三角
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
int a[11],b[11];
int y[11][11];
int n,sum,i,j;
memset(y,0,sizeof(y));
y[1][1]=1;
for(i=2;i<=10;i++){
for(j=1;j<=i;j++){
y[i][j]=y[i-1][j]+y[i-1][j-1];
}
}
/*
for(i=1;i<=10;i++){
for(j=1;j<=i;j++){
printf("%d ",y[i][j]);
}
printf("\n");
}
*/
scanf("%d%d",&n,&sum);
for(i=1;i<=n;i++)
a[i]=i;
do{
int sum1=0;
for(i=1;i<=n;i++){
sum1+=a[i]*y[n][i];
}
if(sum1==sum){
break;
}
}while(next_permutation(a+1,a+n+1));//排列组合
for(i=1;i<=n;i++){
if(i!=n)
printf("%d ",a[i]);
else
printf("%d\n",a[i]);
}
}