组合数的定义
组合数表示为 C n m C_n^m Cnm,它的含义是:从n个不同的元素中,选择m个元素的种数。
组合数的递推公式
C n m = C n − 1 m − 1 + C n − 1 m C_n^m=C_{n-1}^{m-1}+C_{n-1}^{m} Cnm=Cn−1m−1+Cn−1m
递推公式的理解
比如说我们要从5个元素中选取3个元素,那么可以表示为 C 5 3 C_5^3 C53,那么根据递归公式就可以表示成为 c 4 3 + c 4 2 c_4^3+c_4^2 c43+c42。
首先,对于 c 4 2 c_4^2 c42,我们可以理解为在五个数字中找出的三个数字中,包含某个特定元素(这里假设特定元素是1)。那么也就可以理解为我们已经把1这个特定元素取出来了,那么只需要再从除1之外的剩余4个元素中再取出来两个元素即可。
其次,对于 C 4 3 C_4^3 C43的话,可以理解为,我们在五个元素中取出来三个元素,但是这三个元素中没有1这个特定元素,也就是说除了1这个元素,我们只需要在五个元素中的除1这个元素之外的四个元素中再取出来3个元素即可。也就是说五个元素,我们不取1这个元素,那么我们不算1这个元素,那么五个元素就剩下了四个元素,我们只需要在4个元素中取出来三个元素即可保证取出来的三个元素中不会包含1这个元素。
题目描述
给定一个非负整数n,请打印出来杨辉三角的前n行。
解题思路
杨辉三角的规律正好和组合数的递推公式相吻合。
解题代码
#include <stdio.h>
#include <string.h>
int main()
{
int n;
scanf("%d",&n);
int num[n][n];
int i, j;
memset(num,0,n);
num[1][1] = 1;
num[2][1] = 1, num[2][2] = 1;
for( i = 1; i <= n; ++i)
{
for( j = 1; j <= i; ++j)
{
if (j == 1 || j == i)
{
num[i][j] = 1;
printf("1");
continue;
}
else
{
num[i][j] = num[i - 1][j] + num[i- 1][j - 1];
printf("%d",num[i][j]);
}
}
printf("\n");
}
return 0;
}
写在最后
该文章内容是我阅读了CSDN博主英雄哪里出来
的博文后,自己记录的一些观点和想法,希望对大家有帮助。英雄哪里出来
的对应博文地址:组合数