排列與組合是常用的數學方法,其中組合就是從n個元素中抽出r個元素(不分順序且r ≤n),我們可以簡單地將n個元素理解為自然數1,2,…,n,從中任取r個數。
現要求你輸出所有組合。
例如n=5,r=3,所有組合為:
12 3 , 1 2 4 , 1 2 5 , 1 3 4 ,1 3 5 , 1 4 5 , 2 3 4 , 2 3 5 , 2 4 5 , 3 4 5
一行兩個自然數n,r(1所有的組合,每乙個組合佔一行且其中的元素按由小到大的順序排列,每個元素佔三個字元的位置,所有的組合也按字典順序。
**注意哦!輸出時,每個數字需要33個場寬,pascal可以這樣:
write(ans:3);
輸入 #1
5 3
輸出 #1
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
解決方法:
當然可以用遞迴解決,還有一種方法是用二進位制的性質解決。
分析例子:
由輸入 5 3得到的輸出結果我們可以知道可以用11100代表123等以此類推。(方便理解的方式是這樣,用乙個bool 型陣列 data[5] 儲存位置是否輸出,輸出內容為下標+1)。
由給出的輸出可以看出對應的二進位制數為:
1 2 3 -> 11100
1 2 5 -> 11001
1 3 4 -> 10110
1 3 5 -> 10101
1 4 5 -> 10011
2 3 4 -> 01110
2 3 5 -> 01101
2 4 5 -> 01011
3 4 5 -> 00111
上**:分析了本題輸出對應的二進位制,那麼主要問題就是如何得到這個二進位制->先看**,根據**慢慢解釋。
void
work_show
(int n,
int r)
}}
在解釋程式之前先說一下整體思路:因為00111、01011、···、10101、···、11100屬於00000、00001、00010、···、11110、11111即 0 ~ 31,即 0 ~ 25-1(25 = 1 << 5),所以思路就是從0 ~ 2^5-1 的數中找出二進位制符合1的個數等於3的,並按序輸出。因為輸出順序是按照11100~00111的順序來的,所以對應的整數應該倒序,即對應**中的 (x = max -1; x >= 0;x–)
從2^n-1 ~ 0倒序遍歷,num 記錄當下 x 對應二進位制中所含的 1 的個數。
數出x對應二進位制中所含 1 的個數,為了解釋清楚舉個例子:11100,因為奇數即末尾為1的數 & 1 等於 1,相反偶數即末尾為 0 的數 & 1等於 0。所以要判斷 11100 的最高位為多少可以讓其右移4(即 n - 1)位之後 & 1,若等於 1 即該位為 1,相反則為 0。同理,要判斷第二高位是否為1可以讓其右移 3 位,所以 i 代表右移幾位按 n-1 ~ 0 遍歷。
若此時 x 對應的二進位制數所含的 1 個數為 3,此時按該二進位制數代表的序列輸出。輸出方式同 2 中的迴圈。
洛谷P1157 組合的輸出
題目描述 排列與組合是常用的數學方法,其中組合就是從 nn 個元素中抽出 rr 個元素 不分順序且 r le n r n 我們可以簡單地將 nn 個元素理解為自然數 1,2,n1,2,n 從中任取 rr 個數。例如 n 5,r 3n 5,r 3 所有組合為 12 3 1 2 4 1 2 5 1 3 ...
洛谷 P1157 組合的輸出
排列與組合是常用的數學方法,其中組合就是從nn個元素中抽出rr個元素 不分順序且r le n r n 我們可以簡單地將nn個元素理解為自然數1,2,n1,2,n,從中任取rr個數。現要求你輸出所有組合。例如n 5,r 3n 5,r 3,所有組合為 12 3 1 2 4 1 2 5 1 3 4 1 3...
洛谷 P1157 組合的輸出
題目描述 排列與組合是常用的數學方法,其中組合就是從nn個元素中抽出rr個元素 不分順序且r le n r n 我們可以簡單地將nn個元素理解為自然數1,2,n1,2,n,從中任取rr個數。現要求你輸出所有組合。例如n 5,r 3n 5,r 3,所有組合為 12 3 1 2 4 1 2 5 1 3 ...