所以我試圖生成大小爲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