一、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();
}
}
复杂度分析
- 时间复杂度: ,
- 空间复杂度: ,