二进制枚举子集
二进制枚举子集
二进制枚举子集(注意换行问题)
方法一
for (int i = 0; i < (1 << n); ++i) {
for (int j = 0; j < n; ++j)//遍历二进制每一位
if (i & (1 << j))//判断第j位是否存在
// do something;
}
方法一
for (int k = S; k; k = (k - 1) & S) {
for (int i = 0; i < n; ++i){
if ((k >> i) & 1)
//do something;
}
}
算法训练 和为T
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;
}
本文作者:egg-pain
本文链接:https://www.cnblogs.com/egg-pain/p/16589761.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步