【位運算】二進制枚舉入門

一、Problem

有 5 種硬幣,他們面值分別爲:1,2, 3, 4, 5,請列出所有面值組合。比如如果選出面值爲 1、3、4 的硬幣,則輸出 1 3 4

二、Solution

方法一:位運算

這似乎就是在有 N 個元素的集合裏求不同的子集,而又有

  • 含有 0 個元素的子集有 CN0C_N^0 個,
  • 含有 1 個元素的子集有 CN1C_N^1 個,
  • 含有 2 個元素的子集有 CN2C_N^2 個,

又二項式定理得: CN0C_N^0 + CN1C_N^1 + CN2C_N^2 + … + CNNC_N^N = 2N2^N,也就是說不同的子集的個數爲 2N2^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(2N×N)O(2^N × N)
  • 空間複雜度:O(1)O(1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章