1 条题解

  • 0
    @ 2026-2-1 15:08:21
    #include<bits/stdc++.h>
    using namespace std;
    
    // [1] 全局变量:n-数字数量,t-目标和,ans-符合条件的方案数;arr-存储输入数字(long long防溢出);dp-回溯临时存储选中元素
    long long n, t, ans = 0;
    long long arr[50];
    vector<long long> dp;
    
    // 深度优先搜索回溯函数:处理元素选/不选逻辑,主函数调用时跳转至此
    void dfs(int x, long long sum, int num) {
        // [6] 递归终止条件:所有元素处理完毕(x从n倒序至0)
        if (x < 1) {
            // [7] 判断当前路径是否符合要求:和为目标值 且 至少选中一个元素
            if (sum == t && num != 0) {
                // [8] 倒序遍历dp并输出,反转后与输入数字顺序一致
                for (int i = dp.size() - 1; i >= 0; i--) {
                    cout << dp[i] << " ";
                }
                cout << endl;
                ans++; // [9] 符合条件,方案数累加
            }
            return;
        }
        // [10] 优先不选第x个元素,保证解的输出优先级,递归处理前x-1个元素
        dfs(x - 1, sum, num);
        // [11] 选择第x个元素,加入临时存储数组
        dp.push_back(arr[x]);
        // [12] 递归处理前x-1个元素,更新已选和与已选个数
        dfs(x - 1, sum + arr[x], num + 1);
        // [13] 回溯核心操作:移除当前元素,恢复数组原始状态
        dp.pop_back();
    }
    
    int main() {
        // [2] 输入数字的总数量n
        cin >> n;
        // [3] 循环输入n个数字,按1开始的索引存入数组
        for (int i = 1; i <= n; i++) {
            cin >> arr[i];
        }
        // [4] 输入需要达成的目标和t
        cin >> t;
        // [5] 启动深度优先搜索,从最后一个元素(索引n)开始处理,初始和0、初始选中个数0
        dfs(n, 0, 0);
        // [14] 自定义函数执行完毕,回到主函数,输出符合条件的总方案数
        cout << ans;
        return 0;
    }
    
    • 1

    信息

    ID
    1284
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    5
    已通过
    1
    上传者