二进制枚举

本文详细介绍了ACM竞赛中常用的二进制枚举算法,包括其在C++中的性能界限,即大约能枚举22位。通过具体实例演示了如何使用二进制枚举来解决实际问题,并提供了完整的Java实现代码。

二进制枚举

ACM中二进制枚举C++1秒大约能枚举22位,
for循环不能跑太多,
加上子层循环和判断,所以一般范围大概就是在22左右。

int i = 0; i < 1 << 22
1 << 301e9

超过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);
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值