2 solutions

  • 2
    @ 2026-4-11 15:03:32
    #include<bits/stdc++.h>
    using namespace std;
    const int N=22;
    int a[N];
    int main()
    {
        int n,t;
        cin>>n;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
        }
        cin>>t;
        int ans=0;
        for(int i=1;i<1<<n;i++)
        {
            int s=0;
            for(int j=0;j<n;j++)
            {
                if(i>>j&1)
                {
                    s+=a[j];
                }
            }
            if(s==t)
            {
                ans++;
            }
        }
        cout<<ans;
        return 0;
    }
    
    • 2
      @ 2024-4-19 20:07:21
      #include<bits/stdc++.h>
      using namespace std;
      const int N=110;
      int ans[N];
      bool st[N];
      int n;
      int w[N];
      int T;
      int cnt=0;
      void dfs(int u,int sum,int c) //u是当前位置,sum是和,c是已经选择的数的个数 
      {
          if(u==0) //选完了 
          {
              if(sum==T&&c>0) //和满足要求,且至少选了一个数 
              {
                  cnt++;
                  for(int i=1;i<=n;i++) //枚举所有位置 
                  {
                      if(st[i]==1)
                      {
                          cout<<w[i]<<" ";
                      }
                  }
                  cout<<endl;
              }
              return ;
          }
          dfs(u-1,sum,c); //不选 
          st[u]=1; //选 
          dfs(u-1,sum+w[u],c+1); //选了以后搜索下一层 
          st[u]=0; //清空状态 
      }
      int main()
      {
          cin>>n;
          for(int i=1;i<=n;i++)
          {
              cin>>w[i];
          }
          cin>>T; 
          dfs(n,0,0);
          cout<<cnt<<endl;
          return 0;
      }
      
      
      • 1

      Information

      ID
      235
      Time
      1000ms
      Memory
      256MiB
      Difficulty
      5
      Tags
      # Submissions
      17
      Accepted
      12
      Uploaded By