二进制枚举子集

时间:2022-08-05
本文章向大家介绍二进制枚举子集,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

二进制枚举子集

二进制枚举子集(注意换行问题)

从0开始枚举
for (int i = 0; i < (1 << n); ++i) {
        for (int j = 0; j < n; ++j)
            if (i & (1 << j))  // do something;
    }
从1开始枚举
for (int i = 2; i < (1 << (n + 1)); i += 2) 
        for (int j = 1; j <= n; ++j)
            if (i & (1 << j)) // do something;

算法训练 和为T

蓝桥杯

WustOJ

Question:从一个大小为n的整数集中选取一些元素,使得它们的和等于给定的值T。每个元素限选一次,不能一个都不选。

数组从1开始
#include <bits/stdc++.h>  //二进制法
using namespace std;
#define endl '\n'
int main() {
    std::ios_base::sync_with_stdio(false), std::cin.tie(nullptr), std::cout.tie(nullptr);
    int n, ans = 0;
    cin >> n;
    vector<int> a(n + 1);
    for (int i = 1; i <= n; ++i) cin >> a[i];
    long long t, sum;
    cin >> t;
    for (int i = 2; i < (1 << (n + 1)); i += 2) {
        sum = 0;
        for (int j = 1; j <= n; ++j)
            if (i & (1 << j)) sum += a[j];
        if (sum == t) {
            for (int j = 1; j <= n; ++j)
                if (i & (1 << j)) cout << a[j] << ' ';
            cout << endl;
            ++ans;
        }
    }
    cout << ans << endl;
    return 0;
}
数组从0开始
#include <bits/stdc++.h>  //二进制法
using namespace std;
#define endl '\n'
int main() {
    std::ios_base::sync_with_stdio(false), std::cin.tie(nullptr), std::cout.tie(nullptr);
    int n, ans = 0;
    cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; ++i) cin >> a[i];
    long long t, sum;
    cin >> t;
    for (int i = 0; i < (1 << n); ++i) {
        sum = 0;
        for (int j = 0; j < n; ++j)
            if (i & (1 << j)) sum += a[j];
        if (sum == t) {
            bool ok = false;
            for (int j = 0; j < n; ++j)
                if (i & (1 << j)) cout << a[j] << ' ', ok = true;
            if(ok) cout << endl,++ans;
        }
    }
    cout << ans << endl;
    return 0;
}

原文地址:https://www.cnblogs.com/Cattle-Horse/p/16555621.html