题目
关键
1,第一行数的使用次数排列成杨辉三角形的规律
2,next_permutation()全排列函数的使用
题解
这道题完美地展示了c++STL的优越性和高效性,我总是用c的思想去考虑问题,总是去想着如何自己写一个函数去实现,这次也是。当我在苦思冥想全排列函数的实现时,忍不住看了一眼题解,惊了,竟然这么简单,果然像我们这种水平的人千万别总想着如何造轮子,而是应该学会如何正确地使用一个适合的轮子
#include<iostream>
#include<cstdio>
#include<algorithm>
int a[12][12],b[12];
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
if(n==1) cout<<m<<endl;
else
{
a[1][1]=1;
int i,j;
for(i=1;i<=n-1;i++)//给边界赋0,方便做出一棵杨辉三角形的树
{
a[i][0]=a[i][i+1]=0;
}
for(i=2;i<=n;i++)//建立杨辉三角形的表
{
for(j=1;j<=i;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
for(i=1;i<=n;i++)
{
b[i]=i;
}
int sum;
do
{
sum=0;
for(i=1;i<=n;i++)
{
sum+=b[i]*a[n][i];
}
if(sum==m)
{
for(i=1;i<=n-1;i++)
cout<<b[i]<<' ';
cout<<b[n]<<endl;
break;
}
}while(next_permutation(b+1,b+n+1));
}
return 0;
}