补充======
说白了就是求阶乘
fun是阶乘函数
直接调用即可
#include <stdio.h>
long sum=0//组合数结果
long fun(int i) //阶乘
{
If(n==1)
return 1 /*递归出口*/
else
return i*fun(i-1)/*递归体*/
}
long com(int n, int m)
{
sum=fun(m)/fun(n)*fun(m-n)
return sum
}
int main(void)
{
int m=9,n=4
printf("%l" , com(4,9))
return 0
}
def C(n,m):if m > n :
return 0
elif m == 1:
return n
elif n == 1:
return 1
else:
return C(n-1,m-1)+C(n-1,m)
print(C(5,1)) # 5
print(C(5,2)) # 10
print(C(5,3)) # 10
print(C(5,4)) # 5
print(C(5,5)) # 1
典型的组合问题,解法有递归、回溯等等
递归法较简单,代码如下:
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")
}
}
}
其他方法可查阅相关资料。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)