二进制枚举
ACM中二进制枚举C++1秒大约能枚举22位,
for循环不能跑太多,
加上子层循环和判断,所以一般范围大概就是在22左右。
int i = 0; i < 1 << 22
1 << 30是1e9
超过int类型需要转换为long long类型
1ll << 30
1ll << 60
二进制枚举范围为0到2^n - 1。
例题

import java.util.Scanner;
public class Main {
// 15个数
static int[] nums = {9090400, 8499400, 5926800, 8547000, 4958200,
4422600, 5751200, 4175600, 6309600, 5865200,
6604400, 4635000, 10663400, 8087200, 4554000};
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int sum = 0;
for(int i = 0; i < nums.length; i ++) sum += nums[i]; // 求和
int tmp, ans = 0x3f3f3f3f;
for(int i = 0; i < 1 << 15; i ++) { // 0到2^15 - 1种状态
tmp = 0;
for(int j = 0; j < 15; j ++) { // 枚举二进制的15位
if((i >> j & 1) == 1) { // 判断每一位是否为1,为1则表示选,0则表示不选
tmp += nums[j];
}
}
ans = Math.min(ans, Math.abs(sum - tmp - tmp));
}
System.out.println(ans);
}
}
本文详细介绍了ACM竞赛中常用的二进制枚举算法,包括其在C++中的性能界限,即大约能枚举22位。通过具体实例演示了如何使用二进制枚举来解决实际问题,并提供了完整的Java实现代码。
271

被折叠的 条评论
为什么被折叠?



