组合C(N,M)【一个思路,两种解法】
来源:互联网 发布:淘宝刷单一天能赚多少 编辑:程序博客网 时间:2024/05/01 10:48
//下边的代码可以输出各种组合,如果添加一个int全局变量就可以统计个数了。
//如果只统计个数可以用f(n,m)=f(n-1,m-1)+f(n-1,m);而不用拷贝数组、输出数组之类的~
//注意b free的位置,写错2次
//malloc(b)应该放在结束条件之后
#include <stdio.h>
#include <stdlib.h>
#define N 5
#define M 4
void f(int n,int m,int x,int *a)
{
int *b,i;
if (x == M)
{
for(i=0;i<M;i++)printf("%3d",a[i]);
printf("\n");
return;
}
if (n<m || m<=0)
{
return;
}
*(a+x) = n;
f(n-1,m-1,x+1,a);
b = (int *)malloc(sizeof(int)*M);
for (i=0;i<x;i++) *(b+i) = *(a+i);
f(n-1,m,x,b);
free(b);
}
void main()
{
int *a;
a = (int *)malloc(sizeof(int)*M);
f(N,M,0,a);
free(a);
}
//另一种解法。【用循环代替了一重递归】
#include <stdio.h>
#include <stdlib.h>
#define N 5
#define M 3
int sum;
void f(int n,int m,int *a)
{
int i,j;
for (i=n;i>=m;i--)//注意循环条件从n---m
{
a[m-1] = i;
if (m>1)
{
f(i-1,m-1,a);
}
else
{
for(j=M-1;j>=0;j--) printf("%3d",a[j]);
sum++;
printf("\n");
}
}
}
void main()
{
int *a;
a = (int *)malloc(sizeof(int)*M);
f(N,M,a);
printf("%3d\n",sum);
free(a);
}
- 组合C(N,M)【一个思路,两种解法】
- 组合C(m,n)
- 大组合数(C(n,m))
- 组合数C(n,m)
- 两种解法:找出n个自然数(1,2,3,……,n)中取r个数的组合。
- C++/C组合数A(m,n)
- C语言求组合数C(n,m)
- 一个中兴的面试题,输入两个数n和m,从数列1,2,3……n中随意取几个数,使其和等于m,要求将其中所有组合列出来编程求解(c语言递归函数分解法)
- 计算组合公式C(n,m)的化简
- 证明组合数c(n,m)是整数
- SOJ-2704(组合数取余C(n, m))
- 个人模板 组合数 C(m,n)
- 组合数算法 C(n,m)(n>=m)
- m个数取n个进行组合 C m n
- HDU1028Ignatius and the Princess III(一个数有多少种组合方式,DP)与放n个苹果在m个盘子有多少生种组合一样(两种方法解)
- 计算组合数C(m,n)
- C(n,m)的组合问题
- 变态组合数C(n,m)求解
- Java设计模式之单例模式
- n皇后问题【递归】
- tomcat组成及工作原理
- 对Spring的理解
- 骑士走棋盘【非递归,贪心,回溯】
- 组合C(N,M)【一个思路,两种解法】
- 费式数列
- 一个基于SpringSocial的sina微博插件
- 最少硬币问题
- 老鼠走迷宫【2】
- 下学期第三周实验报告4
- 老鼠走迷宫【1】
- S3C6410的PWM部分
- 杨辉三角