1 条题解

  • 0
    @ 2026-1-31 20:46:48
    #include<bits/stdc++.h>
    using namespace std;
    
    // 全局变量定义
    int arr[110];  // [1] 存储输入的数组元素
    int N, K;      // [2] N:数组元素个数,K:目标和
    int ans = 0;   // [3] 统计符合条件的方案数
    
    // 深度优先搜索函数:遍历所有元素的选/不选组合,统计和为K的方案数
    // index:当前处理到的元素下标,current_sum:当前已选元素的累计和
    void dfs(int index, int current_sum) {
        // [4] 递归终止条件:所有元素处理完毕
        if (index == N) {
            // [5] 若当前累计和等于目标和K,方案数+1
            if (current_sum == K) ans++;
            return;
        }
    
        // 【核心剪枝逻辑】
        // [6] 仅当「当前累计和 + 当前元素 ≤ K」时,才选择当前元素(避免后续无效分支)
        if (current_sum + arr[index] <= K) {
            dfs(index + 1, current_sum + arr[index]);  // [7] 选择当前元素,处理下一个元素
        }
    
        // [8] 不选择当前元素,直接处理下一个元素(无剪枝,后续仍可能凑出K)
        dfs(index + 1, current_sum);
    }
    
    // 主函数:处理输入、启动搜索、输出结果
    int main() {
        // [9] 输入处理:读取元素个数N和目标和K
        cin >> N >> K;
        // [10] 读取N个元素存入数组arr
        for (int i = 0; i < N; ++i) {
            cin >> arr[i];
        }
    
        // [11] 启动深度优先搜索:从第0个元素开始,初始累计和为0
        dfs(0, 0);
    
        // [12] 输出符合条件的方案数
        cout << ans << endl;
        return 0;
    }
    
    • 1

    信息

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