题意:给出N和sum。sum是由1-n的任意排列,相邻两个相加,依次循环每次减少一个数得到的
结果。现在要根据sum来找开始的这个排列。
分析:
杨辉三角+暴力。
#include<cstdio>
#include<algorithm>
using namespace std;
int t[15][15];
int a[15];
void init()
{
for(int i=1;i<=10;i++)
{
for(int j=1;j<=i;j++)
{
if(i==1 || i==j)
t[i][j]=1;
else
t[i][j]=t[i-1][j-1]+t[i-1][j];
}
}
}
int main()
{
int n,k,sum;
init();
while(scanf("%d%d",&n,&k)!=EOF)
{
for(int i=1;i<=n;i++)
a[i]=i;
int sum=0;
for(int i=1;i<=n;i++)
sum += a[i]*t[n][i];
if(sum == k)
{
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
continue;
}
while(next_permutation(a+1,a+n+1))
{
sum=0;
for(int i=1;i<=n;i++)
sum += a[i]*t[n][i];
if(sum == k)
{
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
break;
}
}
}
return 0;
}
还有一种写法,不用杨辉三角。
参见博客:http://blog.csdn.net/china_zoujinyong/article/details/17630205
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAX = 10;
int data[MAX];
int n, sum;
void showResult()
{
for(int i=0; i < n; i++)
cout << data[i] << ' ';
cout << endl;
}
bool adjCase()
{
int temp[MAX], i;
for(i=0; i < n; i++)
temp[i] = data[i];
for(int num=n; num > 0; num --)
{
for(i=0; i < num-1; i++)
{
temp[i]=temp[i]+temp[i+1];
}
}
if(temp[0]==sum) return true;
return false;
}
void solveCase()
{
if(adjCase()){
showResult();
return ;
}
while(next_permutation(data, data+n))
{
if(adjCase())
{
showResult();
break;
}
}
}
int main()
{
cin >> n >> sum;
for(int i=1; i <= n; i++)
data[i-1]=i;
solveCase();
return 0;
}