處理排列組合問(wèn)題的通用算法
發(fā)表時(shí)間:2023-08-17 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]很多網(wǎng)友發(fā)貼詢問(wèn)諸如:八皇后問(wèn)題、彩票問(wèn)題(從m中數(shù)中選擇n(m>=n)的組合)等,其實(shí)這都可歸結(jié)為排列組合的問(wèn)題。解決這類(lèi)問(wèn)題,用for循環(huán)嵌套是不現(xiàn)實(shí)的(只能對(duì)指定的m、n編程,而且程序看...
很多網(wǎng)友發(fā)貼詢問(wèn)諸如:八皇后問(wèn)題、彩票問(wèn)題(從m中數(shù)中選擇n(m>=n)的組合)等,其實(shí)這都可歸結(jié)為排列組合的問(wèn)題。解決這類(lèi)問(wèn)題,用for循環(huán)嵌套是不現(xiàn)實(shí)的(只能對(duì)指定的m、n編程,而且程序看上去異常繁瑣),較好的方法是回朔法。下面給出這類(lèi)問(wèn)題的一般算法的c/c++描述:
int combine(int a[],int sub){
//a[1..?]表示候選集,sub表示一個(gè)排列(組合)的元素個(gè)數(shù)
{
int total=sizeof(a);
int order[sub+1];
int count=0;//符合條件的排列(組合)的個(gè)數(shù)
order[0]=-1;
for(int i=1;i<=sub;i++)
order[i]=i;
int k=sub;
bool flag=true;
while(order[0]!=-1){
if(flag){
for(i=1;i<=sub;i++)//輸出符合要求的組合
printf("%d ",a[order[i]]);
printf("\n");
count++;
flag=false;
}
order[k]++;
if(order[k]==total+1){
order[k--]=0;
continue;
}
...
//在此加入order[k]的限制條件
//如果條件滿足,則往下執(zhí)行
//否則continue;
if(k<sub){
order[++k]=order[k-1];
continue;
}
if(k==sub)
flag=true;
}
return count;
}