排列組合的遞歸演算法
① c語言中如何用遞歸的方法求從n個數中取m個數的排列組合的所有情況,其中n<m,要求寫出完整的程序
典型的組合問題,解法有遞歸、回溯等等
遞歸法較簡單,代碼如下:
void combine(int a[], int n, int m, int b[], int M);
參數:
a 存放候選數字
n 總項數
m 取出項數
b 存放選出結果
M = m
#include"stdio.h"
#defineMAX100
voidcombine(inta[],intn,intm,intb[],intM);
intmain(void)
{
inti;
inta[MAX],b[MAX];
for(i=1;i<100;i++)
a[i-1]=i;
combine(a,5,4,b,4);
}
voidcombine(inta[],intn,intm,intb[],intM)
{
inti,j;
for(i=n;i>=m;i--)
{
b[m-1]=i-1;
if(m>1)
combine(a,i-1,m-1,b,M);
else
{
for(j=M-1;j>=0;j--)
printf("%d",a[b[j]]);
printf(" ");
}
}
}
其他方法可查閱相關資料。
② 排列組合中c53是怎麼算的,5在下,3在上
C(5,3)=C(5,2)=5*4/2*1=20/2=10
1、從n個不同元素中,任取m(m≤n)個元素並成一組,叫做從n個不同元素中取出m個元素的一個組合;從n個不同元素中取出m(m≤n)個元素的所有組合的個數,叫做從n個不同元素中取出m個元素的組合數。
2、在線性寫法中被寫作C(n,m)。組合數的計算公式為
即從m個不同元素中取出n個元素的組合數=從m個不同元素中取出 (m-n) 個元素的組合數;
這個性質很容易理解,例如C(9,2)=C(9,7),即從9個元素里選擇2個元素的方法與從9個元素里選擇7個元素的方法是相等的。
規定:C(n,0)=1 C(n,n)=1 C(0,0)=1
參考資料
網路-組合數
③ 排列組合中A和C怎麼算啊
1、排列組合中,組合的計算公式為:
④ c語言 排列組合 程序演算法
#include<stdio.h>
#include<string.h>
void
Show(int
n,int
len
,char
str[],
char
p[],int
*i)
{
/*函數功能說明: 密碼窮舉法
遞歸演算法
參數說明:
len
密碼可選元素的個數,實際等於
strlen(str);
n
密碼位數。
STR[]密碼表。
*p
密碼排列組合的臨時存檔
*/
int
a;
n--;
for(a=0;
a
<
len;
a++)
{
p[n]=str[a];
if(n==0)printf("%d:%s
",(*i)++,p);
if(n>0)Show(n,len
,
str,p,i);
}
} /*驅動程序
用於測試*/
int
main(void)
{
char
str[]="abcdef";//密碼表
可選元素集合可根據選擇修改
int
n=4; //密碼位數,根據具體應用而定。
int
len=strlen(str);//用於密碼元素集合計數。
char
p[20]; //存放排列組合的密碼,用於輸出。
int
num=0;//存放統計個數的整數值,
int
*i=#//計數器
地址。
p[n]='\0';//這個不用說啦。 Show(
n,len
,str,
p
,i);
printf("\n%d
位密碼,每個密碼有%d個選擇的話,共有:%d個組合。\n",n,len,*i); return
0;
}
⑤ 排列組合演算法,要求從一堆數中任取m個數組合使得m個數的和最接近某個數
典型的組合問題,解法有遞歸、回溯等等遞歸法較簡單,代碼如下: void combine(int a[], int n, int m, int b[], int M); 參數:a 存放候選數字n 總項數m 取出項數b 存放選出結果M = m
#include "stdio.h"#define MAX 100 void combine(int a[], int n, int m, int b[], int M); int main(void){ int i; int a[MAX], b[MAX]; for (i = 1; i < 100; i++) a[i - 1] = i; combine(a, 5, 4, b, 4);} void combine(int a[], int n, int m, int b[], int M){ int i, j; for (i = n; i >= m; i--) { b[m - 1] = i - 1; if (m > 1) combine(a, i - 1, m - 1, b, M); else { for (j = M - 1; j >= 0; j--) printf("%d ", a[b[j]]); printf("\n"); } }}
其他方法可查閱相關資料。
⑥ 全排列演算法(摻雜了遞歸)理解不了,幫忙看看
解釋:
int p[]; // 用來存放參與排列組合的數據的數組(有效元素下標從 1 到 n)
int n; // 參與排列組合的數據的個數
void perm(int m){……}
// 用來進行局部排列組合的函數
// 其中的 m 表示本輪局部排列組合的起點,即,將數組中 m 到 n 的元素進行排列組合
// 但是如果 m==n 則表示已經完成了一個排列組合,所以輸出一個排列組合結果。
程序注釋:
voidperm(intm){
intj,temp;//j循環中要處理的元素下標,temp交換數據時要用到的臨時變數
if(m==n)//如果需要進行局部排列組合的數據就只是最後一個數據
{
//那麼不需要再進行局部排列組合了,
//直接輸出數組中的所有數據,得到了一個排列結果。
for(j=1;j<=n;j++)
printf("%d",p[j]);//輸出每一個數據
printf(" ");//追加一個換行符
return;//本輪局部排列組合結束
}
//保持m號元素之前的數據不變,
//將m到n的元素進行局部排列組合。
for(j=m;j<=n;j++)
{
temp=p[m];p[m]=p[j];p[j]=temp;//將m到n的元素逐個交換到m位置上
perm(m+1);//再對m之後的部分進行局部排列組合。
temp=p[m];p[m]=p[j];p[j]=temp;//把以前在m位置上的數據交換回來
}
}
比如要對 1,2,3,4,5 進行全排列組合
先從 1,2,3,4,5 中,每次選出一個作為第一個數
然後再從其餘的數字中,每次選出一個作為第二個數
然後再從其餘的數字中,每次選出一個作為第三個數
然後再從其餘的數字中,每次選出一個作為第四個數
再將最後剩下的數據作為第五個數
⑦ 排列組合演算法
可用遞歸演算法 實現N重循環 來實現
詳細請QQ :115499275
以下也許有助於你
以下為文件<Form1.frm>的內容:
VERSION 5.00
Begin VB.Form Form1
Caption = "Form1"
ClientHeight = 8115
ClientLeft = 60
ClientTop = 345
ClientWidth = 5760
LinkTopic = "Form1"
ScaleHeight = 8115
ScaleWidth = 5760
StartUpPosition = 3 '窗口預設
Begin VB.ComboBox Combo1
Height = 300
Left = 4200
TabIndex = 2
Text = "Combo1"
Top = 960
Width = 1215
End
Begin VB.TextBox Text1
Height = 7455
Left = 120
MultiLine = -1 'True
ScrollBars = 2 'Vertical
TabIndex = 1
Text = "Form1.frx":0000
Top = 120
Width = 3855
End
Begin VB.CommandButton Command1
Caption = "Command1"
Height = 495
Left = 4200
TabIndex = 0
Top = 120
Width = 1215
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Dim Pwd As String
Function NFormM(ByVal iStart As Integer, iEnd As Integer, Num As Integer, Optional Str As String)
Dim i As Integer
If Num = 0 Then
With Text1
.Text = Text1.Text & Str & vbNewLine
.SelStart = Len(.Text)
End With
Else
For i = iStart To iEnd
DoEvents
NFormM i + 1, iEnd, Num - 1, Str & Mid(Pwd, i, 1)
Next
End If
End Function
Private Sub Command1_Click()
Dim out(), i As Integer, s As String
Text1.Text = ""
NFormM 1, Len(Pwd), Val(Combo1.Text)
End Sub
Private Sub Form_Load()
Dim i As Integer
With Combo1
For i = 1 To 12
.AddItem i
Pwd = Pwd & Chr(64 + i)
Next
Print Pwd
End With
End Sub
⑧ 設計遞歸演算法生成n個元素的所有排列對象
#include<iostream>
#include<iterator>
#include<algorithm>
using namespace std;
template<class T>
void permutation(T list[], int k, int m)
{
if (k == m)
{
(list, list + m + 1, ostream_iterator<T>(cout, "")); //將當前list排序
cout << endl;
}
else{
for (int i = k; i <= m; i++)
{
swap(list[i], list[k]); //將下標為i的元素交換到k位置,類似從list[k:m]中剔除操作
permutation(list, k + 1, m);
swap(list[i], list[k]);
}
}
}
int main(int argc, char* argv[])
{
char arr[3] = { 'a', 'b', 'c' };
cout << "排序結果如下:" << endl;
permutation(arr, 0, 2);
return 0;
}
(8)排列組合的遞歸演算法擴展閱讀
遞歸,在數學與計算機科學中,是指在函數的定義中使用函數自身的方法。也就是說,遞歸演算法是一種直接或者間接調用自身函數或者方法的演算法。
通俗來說,遞歸演算法的實質是把問題分解成規模縮小的同類問題的子問題,然後遞歸調用方法來表示問題的解。
遞歸的基本原理
第一:每一級的函數調用都有自己的變數。
第二:每一次函數調用都會有一次返回。
第三:遞歸函數中,位於遞歸調用前的語句和各級被調用函數具有相同的執行順序。
第四:遞歸函數中,位於遞歸調用後的語句的執行順序和各個被調用函數的順序相反。
第五:雖然每一級遞歸都有自己的變數,但是函數代碼並不會得到復制。
⑨ 關於排列組合的一些演算法編程問題
#include <stdio.h>
void delect(int n,int *p)
{
int i,j=0,k,a[n],b[n];
int temp[10]={1,2,3,4,5,6,7,8,9,10};
for(i=0;i<n;i++)
a[i]=*(p+i);
for(i=0;i<n;i++)
for(j=0;j<10;j++)
if(a[i]==temp[j])
temp[j]=-1;
for(i=0,j=0;i<10;i++)
if(temp[i]>0)
b[j++]=temp[i];
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
for(k=j+1;k<n;k++)
printf("(%d,%d,%d) ",b[i],b[j],b[k]);
}
main()
{
int a[10],i,j,k,N;
int *p=a;
printf("how much nums:");
scanf("%d",&N);
printf("input nums:");
for(i=0;i<N;i++)
scanf("%d",&a[i]);
for(i=0;i<N;i++)
for(j=i+1;j<N;j++)
for(k=j+1;k<N;k++)
printf("(%d,%d,%d) ",a[i],a[j],a[k]);
//for(i=0;i<N;i++) printf("%d",*(p+i));
printf(" delect ");
delect(10-N,p);
}
⑩ 在C語言中怎麼設計排列組合的演算法呢(請勿百度演算法給我謝謝,我想知道怎麼想得到這個演算法)謝謝!
採用遞歸思路:假設有A1,A2,A3...An種元素
排列:
(1)把所有元素作為一個集合,可以拆分為一個元素+剩餘元素的子集合,有n種拆法(A1/剩餘元素,A2/剩餘元素...An/剩餘元素)
(2)把第一步中的子集合,按照(1)的思路進一步拆分,直到滿足(3)
(3)當子集合中只有1種元素時,此時為Ax/Ay,排列就只有兩種:Ax+Ay和Ay+Ax
組合:計算出排列後,組合就是:判斷新生成的排列方案與之前的排列方案是否為同一種組合,比如Ax+Ay與Ay+Ax是不同的排列、是相同的組合