排列组合的递归算法
① 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是不同的排列、是相同的组合