题意描述:
给你两个整数,n和m,用杨辉三角形的形式用1-n的各个数字去合成m。
让你根据m去推导出字典序最小的组成。
- 16可以由这样推导而来。
解题思路:
既然要求字典序最小,我们就全排列从小的开始,枚举所有的1-n的底层,去推导是否等于m即可。
解题代码:
#include<iostream>
#include<vector>
using namespace std;
int n; int final;
int flag[11] = { 0 };
vector<int>temp;
vector<int>tmp;
int f = 0;
void dfs(int step)
{
if (f)
return;
if (step == n)
{
tmp = temp;
for (int i = 0; i < n - 1; i++)
{
for(int j=0;j<tmp.size()-i-1;j++)
tmp[j] = tmp[j] + tmp[j + 1];
}
//cout << tmp[0] << endl;
if (tmp[0] == final)
{
f = 1;
for (int i = 0; i < temp.size(); i++)
{
if (i != 0)
cout << " ";
cout << temp[i];
}
cout << endl;
}
return;
}
for (int i = 1; i <= n; i++)
{
if (flag[i] == 0)
{
flag[i] = 1;
temp.push_back(i);
dfs(step + 1);
temp.pop_back();
flag[i] = 0;
}
}
}
int main()
{
cin >> n >> final;
memset(flag, 0, sizeof(flag));
f = 0;
dfs(0);
return 0;
}