所以我试图生成大小为n的所有二进制文件,但条件是只有k 1s。即获取大小为n的所有二进制组合,但只有k 1s
为大小为n = 4,K = 2,(有2超过4的组合)
1100
1010
1001
0110
0101
0011
我卡,不能找出如何产生这一点。
所以我试图生成大小为n的所有二进制文件,但条件是只有k 1s。即获取大小为n的所有二进制组合,但只有k 1s
为大小为n = 4,K = 2,(有2超过4的组合)
1100
1010
1001
0110
0101
0011
我卡,不能找出如何产生这一点。
一种方法是从n
数字集合0,n-1
中生成k
值的所有组合,并使用这些值设置输出中的相应位。
This Q&A说明如何从n
生成k
元素的所有组合。有了这些组合,可以使用按位或的1 << v[c][i]
来产生最终结果,其中v[c][i]
代表i
组合编号c
中的第几个数字。
用于打印所有二进制序列剩下的就是执行您的约束的基本递归方法:
private static void binSeq(int n, int k, String seq) {
if (n == 0) {
System.out.println(seq);
return;
}
if (n > k) {
binSeq(n - 1, k, seq + "0");
}
if (k > 0) {
binSeq(n - 1, k - 1, seq + "1");
}
}
这里是我的非递归拿到这个算法。因为有二进制字符串的2^n
排列,我们可以使用一个for循环通过每个可能的串进行迭代,并检查是否“1”的量不等于k
:
private static void generate(int n, int k) {
for (int i = 0; i < Math.pow(2, n); i++) {
if (Integer.bitCount(i) != k) {
continue;
}
String binary = Integer.toBinaryString(i);
if (binary.length() < n) {
System.out.format("%0" + (n - binary.length()) + "d%s\n", 0, binary);
} else {
System.out.println(binary);
}
}
}
INT N = 4, K = 2;
我认为这是最简单的答案。
你应该至少能够想出一个基本的强力方法 – Androbin
在Knuth中实际上有一个很好的迭代方法,但我没有时间在这里实现它。从最低的“k”位开始,然后考虑如何找到下一个数字。在每次迭代中,在至少一个1之后找到最低的0位。设置最低的0位,然后如果你已经计算超过'm'1,则将最低的'm-1'位设置为1。 – Persixty