在解決poj753-flip games之前,我們先來看這樣乙個問題:"給出乙個陣列a[6]=,求從中任取n個元素的所有組合。"
如果任取1個元素,那麼組合是:
1 ,2 ,3 ,4 ,5 ,6.
如果任取2個元素,那麼組合是:
1 2,1 3,1 4,1 5,1 6.
2 3,2 4,2 5,2 6.
3 4,3 5,3 6.
4 5,4 6.
5 6.
不再舉例。
這個問題很明顯的需要用列舉的思想來一一遍歷陣列元素並進行無重複組合,但是演算法該怎麼實現呢?
如果任取3個元素,首先我得先找第乙個元素,考慮到不重不漏:
第乙個元素只能從1~4中選取;
假如第乙個元素取1,第二個元素就只能從2~5中選取;
如果第乙個元素選1第二個元素選2,第三個元素就只能從3~6中選取。
以此類推。
所以這時我們就可以考慮到用遞迴的思想來解決列舉的演算法:
首先列舉選取第乙個元素,並把其儲存在乙個陣列中,在第乙個元素列舉完後,如果規定的元素選取個數沒有達到,則從已取得的第乙個元素之後開始,再進行列舉,直到完成規定元素選取個數。在列舉選取的同時把選出來的元素按序依次儲存在乙個陣列裡面,完成選取後把陣列中的元素全部輸出即可。
演算法實現如下
void ienum(int start, int count, int num, int a_len, int *a, int *tem)
else /*否則縮小列舉範圍,進行下乙個元素的列舉選取*/
ienum(i+1, count-1, num, a_len, a, tem);
}}
完整**如下:
#include void ienum(int start, int count, int num, int a_len, int *a, int *tem)
else
ienum(i+1, count-1, num, a_len, a, tem); }}
int main()
; for(num = 1; num<=6; ++num)/*從中任取1個~6個元素的所有組合*/
ienum(0, num, num, 6, a, tem);
getchar();
return 0;
}
結果輸出:
1 2
3 4
5 6
1 2
1 3
1 4
1 5
1 6
2 3
2 4
2 5
2 6
3 4
3 5
3 6
4 5
4 6
5 6
1 2 3
1 2 4
1 2 5
1 2 6
1 3 4
1 3 5
1 3 6
1 4 5
1 4 6
1 5 6
2 3 4
2 3 5
2 3 6
2 4 5
2 4 6
2 5 6
3 4 5
3 4 6
3 5 6
4 5 6
1 2 3 4
1 2 3 5
1 2 3 6
1 2 4 5
1 2 4 6
1 2 5 6
1 3 4 5
1 3 4 6
1 3 5 6
1 4 5 6
2 3 4 5
2 3 4 6
2 3 5 6
2 4 5 6
3 4 5 6
1 2 3 4 5
1 2 3 4 6
1 2 3 5 6
1 2 4 5 6
1 3 4 5 6
2 3 4 5 6
1 2 3 4 5 6
每日一演算法 m元素中取n個元素 高效演算法
五個數種取三個 1 1 1 0 0 1 2 3 1 1 0 1 0 1 2 4 1 0 1 1 0 1 3 4 0 1 1 1 0 2 3 4 1 1 0 0 1 1 2 5 1 0 1 0 1 1 3 5 0 1 1 0 1 2 3 5 1 0 0 1 1 1 4 5 0 1 0 1 1 2 4 ...
js中取陣列第乙個元素
var a 1,2,2,3,4 console.log a a.shift console.log a 5 1,2,2,3,4 4 2,2,3,4 pop 刪除原陣列最後一項,並返回刪除元素的值 如果陣列為空則返回undefined shift 刪除原陣列第一項 相當於lpop push 將引數新增...
從乙個陣列中隨機取出一定數量元素組成新陣列
從乙個陣列中隨機取出一定數量元素組成新陣列 param array 乙個string型別的陣列 param number需要取出元素的數量 return 乙個隨機的陣列 throws nullpointerexception原陣列不能為空 throws arrayindexoutofbound ce...