zoukankan      html  css  js  c++  java
  • 计蒜客:得到整数X (二进制枚举子集)

    #include <iostream>
    #include <cstring>
    using namespace std;
    
    int main()
    {
       int n,m;cin>>n>>m;
       int a[30];
       memset(a,0,sizeof(a));
       for(int i=0;i<n;i++)
        cin>>a[i];
       int ans = 0;
       for(int i=0;i<(1<<n);i++)
       {
           int num = 0;
           for(int j=0;j<n;j++)
           {
               if(i&(1<<j))
                  num+=a[j];
           }
           if(num==m) ans++;
       }
       cout<<ans<<endl;
        return 0;
    }
    

    hdu 5616

    和上面一题基本上是一样的,需要注意的是:枚举出砝码所有可以组成的情况,并且标记一下,然后就可以O(1)查询了,不然会超时。。

    #include <iostream>
    #include <cstring>
    using namespace std;
    const int Max =(1<<20)+10;
    int vis[Max];
    int a[30],n;
    void fun()
    {
        memset(vis,0,sizeof(vis));
        int ans =0;
        for(int i=0;i<(1<<n);i++)
        {
            int num=0;
            for(int j=0;j<n;j++)
            {
                if(i&(1<<j)) num+=a[j];
            }
            vis[num]=1;
            for(int j=0; j<n; j++)
            {
                if(num-a[j]>=0)
                {
                     vis[num-a[j]]=1;
                }
            }
        }
    }
    int main()
    {
        int T;cin>>T;
        int x;
        while(T--)
        {
            cin>>n;
            for(int i=0;i<n;i++)
                cin>>a[i];
            fun();
            int m;cin>>m;
            for(int i=0;i<m;i++)
            {
                cin>>x;
                if(vis[x]==1) cout<<"YES"<<endl;
                else cout<<"NO"<<endl;
            }
        }
        return 0;
    }
    
  • 相关阅读:
    算法作业实验三
    牛客练习赛53 B 美味果冻
    牛客练习赛53 C 富豪凯匹配串
    bitmat
    牛客挑战赛33 B 鸽天的放鸽序列
    树状数组
    线段树
    2019牛客国庆集训派对day7 A 2016
    背包
    作业三 -并查集
  • 原文地址:https://www.cnblogs.com/qie-wei/p/12094112.html
Copyright © 2011-2022 走看看