【位运算】二进制枚举入门

一、Problem

有 5 种硬币,他们面值分别为:1,2, 3, 4, 5,请列出所有面值组合。比如如果选出面值为 1、3、4 的硬币,则输出 1 3 4

二、Solution

方法一:位运算

这似乎就是在有 N 个元素的集合里求不同的子集,而又有

  • 含有 0 个元素的子集有 C N 0 C_N^0 个,
  • 含有 1 个元素的子集有 C N 1 C_N^1 个,
  • 含有 2 个元素的子集有 C N 2 C_N^2 个,

又二项式定理得: C N 0 C_N^0 + C N 1 C_N^1 + C N 2 C_N^2 + … + C N N C_N^N = 2 N 2^N ,也就是说不同的子集的个数为 2 N 2^N 个。

回到题目中,不妨用二进制位 1 来表示集合 set 中被选中的元素,0 表示集合 set 中没被选中的元素,那么我选 1 3 4 这三个面值则应为:

set 1 2 3 4 5
二进制 1 0 1 1 0
面值状态 × ×
import java.util.*;
import java.math.*;
import java.io.*;
public class Main{
	static class Solution {
		void binary_enum(int n) {
			int tot = 1 << n;
			for (int i = 0; i < tot; i++) {
				for (int j = 0; j < n; j++) {
					if ((i & (1 << j)) > 0)
						System.out.printf("%d ", j);
				}
				System.out.println();
			}
		}
		void init() {
			Scanner sc = new Scanner(new BufferedInputStream(System.in));
			int n = sc.nextInt();
			binary_enum(n);
		}
	}
    public static void main(String[] args) throws IOException {  
        Solution s = new Solution();
		s.init();
    }
}

复杂度分析

  • 时间复杂度: O ( 2 N × N ) O(2^N × N)
  • 空间复杂度: O ( 1 ) O(1)
原创文章 786 获赞 313 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_43539599/article/details/105874415