组合数

求组合数模板

int C(int n,int m)
{
    if(m<0 || m>n)
        return 0;
    int ans=1;
    for(int i=1; i<=m; ++i)
    {
        ans=ans*(n-m+i)/i;
    }
    return ans;
}

递归求组合数:

int C(int n,int m)//求组合数C(n,m)
{
    if (m==0 || n==m)
        return 1;
    else
        return C(n-1,m)+C(n-1,m-1);
}

组合数递推模板:

int C[N][N];
void init()
{
    for(int i=0; i<=100; i++)
        C[i][0]=1;
    for(int i=1; i<=100; i++)
        for(int j=1; j<=i; j++)
        {
            C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
        }
}

C[1][0] = C[1][1] = 1;
for (int i = 2; i < N; i++)
{
    C[i][0] = 1;
    for (int j = 1; j < N; j++)
        C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]);
}

枚举组合数 NYOJ32 组合数(深搜DFS)

样例输入:

5 3

样例输出:

543
542
541
532
531
521
432
431
421
321

代码:

#include <stdio.h>  
#include <string.h>  
#include <iostream>  
#include <math.h>  
#include <stack>  
#include <queue>  
#include <vector>  
#include <algorithm>  
#define mem(a,b) memset(a,b,sizeof(a))  
using namespace std;  
int n,m;  
int num[100];  
int dfs(int nn,int mm)  
{  
    int i;  
    if(mm==0)  
    {  
        for (i=m; i>0; i--)  
            printf("%d",num[i]);  
        printf("\n");  
        return 0;  
    }  
    for (i=nn; i>=mm; i--)  
    {  
        num[mm]=i;  
        dfs(i-1,mm-1);  
    }  
}  
int main()  
{  
    scanf("%d%d",&n,&m);  
    dfs(n,m);  
    return 0;  
}

results matching ""

    No results matching ""