今天在做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 }