今天在做poj 1753時,需要列舉乙個陣列中所有組合。之前也遇到過類似的問題,如求從n個陣列任意選取乙個元素的所有組合都是想起來比較簡單,但是設計成演算法卻頗費周折。
如陣列為,那麼從它中取出3個元素的組合有哪些,取出4個元素的組合呢?
比如取3個元素的組合,我們的思維是:
取1、2,然後再分別取3,4,5,6;
取1、3,然後再分別取4,5,6;
......
取2、3,然後再分別取4,5,5;
......
這樣按順序來,就可以保證完全沒有重複。
這種順序思維給我們的啟示便是這個問題可以用遞迴來實現,但是僅從上述描述來看,卻無法下手。
我們可以稍作改變:
1.先從陣列中a取出乙個元素,然後再從餘下的元素b中取出乙個元素,然後又在餘下的元素c中取出乙個元素
2.按照陣列索引從小到大依次取,避免重複
1 #include2 #include3 #include4 #include5 #include6 #include7
using
namespace
std;
8const
int maxn = 10010;9
const
int inf = 0x3f3f3f
;10 typedef long
long
ll;11
//a為原始陣列
12//
start為遍歷起始位置
13//
result儲存結果,為一維陣列
14//
count為result陣列的索引值,起輔助作用
15//
num為要選取的元素個數
16//
a_len為原始陣列的長度,為定值
17void combine_increase(int* a, int start, int* result, int count, const
int num,const
inta_len)
18 30 printf("\n"
);31}32
else
3336}37
}38//a為原始陣列
39//
start為遍歷起始位置
40//
result儲存結果,為一維陣列
41//
count為result陣列的索引值,起輔助作用
42//
num為要選取的元素個數
43void combine_decrease(int* a, int start, int* result, int count, const
intnum)
44 53
else
5460 printf("\n"
);61}62
}63}64
intmain()65;
67int num = 4;68
int result[4
];69 combine_increase(a, 0, result, num, num, sizeof a / sizeof(int
));70 printf("
分界線\n");
71 combine_decrease(a, sizeof a / sizeof(int
), result, num, num);
72return0;
73 }
求從n個陣列任意選取乙個元素的所有組合
最近做專案碰到這個問題,如題從n個陣列任意選取乙個元素的所有組合。比如已知陣列是 1,3 2,4 5 最後組合結果是 1,2,5 1,4,5 3,2,5 3,4,5 網上看了好多帖子,發現寫的太複雜,於是自己動手解決。直接貼解決方案 方法一 執行組合排列的函式 function doexchange...
js從陣列中取出n個不重複的資料
首先,針對這個陣列做乙個去重處理,避免你在後面取資料的時候,因為取到相同的元素而又要多去取一次隨機數 將獲取到的不重複的陣列,再到這裡樣本裡面去取隨機數 每取到一次,就將這個元素從 不重複的陣列 中刪除,這樣length就會 減1 最後返回我們取到的陣列,就是不重複的資料 array 傳入的陣列 去...
排列組合 從n個自然數中取出r個數的組合
這種題目一般有兩種方法,比較直接的方法就是使用循壞,但是對於這種方法只有r小於等於4時才是可行的,這個時候複雜度是 o n r 可知,這種方法的時間複雜度很高,而且這種迴圈機制嚴重依賴r,通過r來控制迴圈層數,因此這種方法不具有普遍性。最常用的方法就是使用遞迴。在迴圈演算法設計中,每個組合中的資料都...