1 条题解

  • 0
    @ 2026-3-26 15:37:41

    解题思路 本题 n≤20,子集总数为 2^20,可以暴力枚举所有子集: 对于每个数字,只有两种选择:选 或 不选;

    这里提供两种写法,第一种最后再计算总和 第二种传参tot 最后直接判断

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    int n,x,ans;
    int a[25],vis[25];
    
    // DFS枚举第i个数字选或不选
    void dfs(int i){
       // 递归边界:已经枚举完所有n个数字
       if(i==n+1){
        int res=0;
        // 计算当前选中的数字的和
        for(int i=1;i<=n;i++){
            if(vis[i]==1)res+=a[i];
        }
        // 如果和小于x,答案+1
        if(res<x)ans++;
        return ;
       }
       // 不选第i个数字
       vis[i]=0;
       dfs(i+1);
       // 选第i个数字
       vis[i]=1;
       dfs(i+1);
    }
    signed main(){
       cin>>n>>x;
       for(int i=1;i<=n;i++){
        cin>>a[i];
       }
       // 从第一个数字开始DFS
       dfs(1);
       cout<<ans;
    }
    
    • @ 2026-3-26 15:39:24
      #include<bits/stdc++.h>
      using namespace std;
      #define int long long
      int n,x,ans;
      int a[25],vis[25];
      
      // DFS枚举第i个数字选或不选
      void dfs(int i,int tot){
         // 递归边界:已经枚举完所有n个数字
         if(i==n+1){
          // 如果和小于x,答案+1
          if(tot<x)ans++;
          return ;
         }
         // 不选第i个数字
         dfs(i+1,tot);
         // 选第i个数字
         dfs(i+1,tot+a[i]);
      }
      signed main(){
         cin>>n>>x;
         for(int i=1;i<=n;i++){
          cin>>a[i];
         }
         // 从第一个数字开始DFS
         dfs(1,0);
         cout<<ans;
      }
      

信息

ID
832
时间
1000ms
内存
256MiB
难度
6
标签
递交数
24
已通过
10
上传者