点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,sum;
int pascal[13][13];
int res[13];
bool used[13];
void dfs(int dep,int csum)
{
//当前和大于sum的剪枝
if(csum>sum) return;
//等于n层但和小于sum的剪枝以及结果正确的判断
if(dep>n){
if(sum==csum){
for(int i=1;i<=n;i++) cout<<res[i]<<" ";
exit(0);
}else return;
}
for(int i=1;i<=n;i++){
if(!used[i]){
res[dep]=i;
used[i]=true;
dfs(dep+1,csum+i*pascal[n][dep]);
used[i]=false;
}
}
}
int main()
{
scanf("%d%d",&n,&sum);
pascal[1][1]=1;
for(int i=2;i<=n;i++){
for(int j=1;j<=i;j++) pascal[i][j]=pascal[i-1][j-1]+pascal[i-1][j];
}
dfs(1,0);
return 0;
}
深度搜索,题目的关键是找到给出n个数字组成答案的系数与杨辉三角满足的关系
然后对n的数字进行搜索,dep是选择的数字的个数,还有一个传值参数是currentsum,所有的搜索操作都在if中进行的,我们从小到大(为了保证字典序)搜索n个数,如果没被使用过,就递归到下一层,并把它放进答案数组,剪枝的条件是csum>sum,以及dep==n时候的如果和还是小于sum,需要注意最后的条件是dep>n