2 条题解

  • 0
    @ 2026-4-6 19:19:08
    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    /* 开始学习二进制枚举:他是dfs的一种简化
       仅用来做 1暴力枚举(n<20) 2选与不选----之后总结果出来了再进行下一步处理 
       小模版:int a[]={1,2,3}--待选元素与数组
        int n=sizeof(a)/sizeof(a[0])
        for(int i=0;i<(1<<n);i++)//n个数 共 0000--1111 2的n次即 1<<n; 
        {
          //此时 i就是一种情况
    	  //情况具体化
    	  for(int j=0;j<n;j++)
    	  {
    	   if((i>>j)&1)//进行处理 
          }
        }
        注意注意!!!起点与终点(是否可以全不选与全选) 
       ///////////////////////////////////////////////
       回到本题:n个数,x 多少个组合+ <x; 
    */
    const int N=30;
    int a[N];
    int ans;
    int n,x;
    signed main()
    { std::ios::sync_with_stdio(0);
      cin.tie(0),cout.tie(0);	
        cin>>n>>x;
        for(int i=0;i<n;i++) cin>>a[i];
        for(int i=0;i<(1<<n);i++)
        {
          int sum=0;
          for(int j=0;j<n;j++)
          {
          	if((i>>j)&1)
          	 sum+=a[j];
    	  }
    	  if(sum<x) ans++;
    	}
    	cout<<ans<<"\n";	
    	return 0;
    }
    • 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;
        }
        
    • 1

    信息

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