一、Problem
有 5 種硬幣,他們面值分別爲:1,2, 3, 4, 5,請列出所有面值組合。比如如果選出面值爲 1、3、4 的硬幣,則輸出 1 3 4
二、Solution
方法一:位運算
這似乎就是在有 N 個元素的集合裏求不同的子集,而又有
- 含有 0 個元素的子集有 個,
- 含有 1 個元素的子集有 個,
- 含有 2 個元素的子集有 個,
…
又二項式定理得: + + + … + = ,也就是說不同的子集的個數爲 個。
回到題目中,不妨用二進制位 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();
}
}
複雜度分析
- 時間複雜度:,
- 空間複雜度:,