题意:给一个数m,按照杨辉三角的求和次数向上分解n层,求第n层可能出现的所有情况中字典序最小的。
分析:向上分解的情况符合杨辉三角的规律,即s[n][0]=s[n-1][0]+s[n-1][1]这样,所以从上向下进行求和,直到某一行的第一个数是m时,就得到了最小的解。
收获:杨辉三角的操作方式,一层一层操作。
AC:
#include <iostream>
#include <algorithm>
using namespace std;
int a[15],b[15];
int main ()
{
int m,n;
cin >> m >>n;
for(int i=0; i<m; i++)
{
a[i]=i+1;
}
while(next_permutation(a,a+m))
{
for(int i=0; i<m; i++)
{
b[i]=a[i];
}
for(int i=m; i>1; i--)
{
for(int j=0; j<i-1; j++)
{
b[j]=b[j+1]+b[j];//每个b【j】都会动态的向下一层移动,b[i]用完之后就没用了,这里很6
}
}
if(b[0]==n)break;
}
for(int i=0; i<m; i++)
{
cout << a[i] << " " ;
}
return 0;
}