• 二进制枚举子集


    思路:

     利用二进制的“开关”特性枚举;
     详细为:如果给定集合A大小为n,则想象A = {a[0], a[1], ..., a[n-1]}的每一个元素相应一个开关位(0或1),0表示不出现,1表示出现。
     当每一个元素的开关位的值确定时,就得到一个子集。因此共同拥有2^n-1种情况(全0为空集,这里不考虑);
     我们利用区间[1, 2^n-1],该区间上的每一个整数相应一个子集。相应方法是遍历该整数二进制表示的每一位。
     若该位为1则相应子集中存在相应元素。否则不存在。
    

    代码:

    #include <bits/stdc++.h>//二进制法
    using namespace std;
    void print_subset(int n, int s)
    {
        for (int i = 0; i < n; i++)
            if (s & (1 << i))
                cout << i << " ";
        cout << endl;
    }
    int main(int argc, char const *argv[])
    {
        int n;
        while (cin >> n && n)
            for (int i = 0; i < (1 << n); i++)
                print_subset(n, i);
        return 0;
    }

    CF #306 (Div. 2) B. Preparing Olympiad

    题意:
      给你一个数组。求满足子集的个数:
      满足的条件: 子集中全部元素的和不超过给定的l 和 r ;
                 最大值-最小值 < x;
    
    代码:
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<math.h>
    using namespace std;
    #define LL long long
    #define clr(a,b) memset(a,b,sizeof a)
    int n,l,r,x;
    int A[26];
    int main()
    {
        #ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
        #endif // ONLINE_JUDGE
         while(~scanf("%d%d%d%d",&n,&l,&r,&x))
         {
             for(int i=0; i<n; i++){
                scanf("%d",&A[i]);
             }
             int m=1<<n;
             int cnt=0;
             for(int i=0; i<m; i++){
                int Max=-1;
                int Min=0x3f3f3f3f;
                int s=0;
                for(int j=0; j<n; j++){
                    if(i&(1<<j)){
                        s+=A[j];
                        if(A[j]>Max)  Max=A[j];
                        if(A[j]<Min)  Min=A[j];
                    }
                }
                if(s>=l&&s<=r&&Max-Min>=x)  cnt++;
             }
             printf("%d
    ",cnt);
         }
        return 0;
    }
    
  • 相关阅读:
    IOS开发-CALayer和UIView详细汇总
    IOS开发-第三方SDWebImage下载网络图片的使用
    解决TalbleView头部或底部子控件不显示问题
    node.js http.get 和http.post 数据
    Node.js Express 获取request原始数据
    个人开发者做一款Android App需要知道的事情
    个人开发者的酸甜苦辣
    码农的福利来了, 编程在线Androd 客户端上线了
    console使用技巧
    AngularJS 常用语法
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7099628.html
Copyright © 2020-2023  润新知