P1118 Backward Digit Sums G/S

点击查看代码
#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
posted @ 2025-12-10 16:44  gosaky  阅读(2)  评论(0)    收藏  举报