一、 问题描述
二、算法思想
动态规划是一种将问题分解成子问题并保存子问题解以避免重复计算的算法思想。
对于组合数C(n, r),我们可以将问题分解成子问题C(i, j),其中i表示从1到n的选择数,j表示选择的元素个数。则C(n, r)可以通过求解C(i, j)来得到。
动态规划的递推关系为: C(i, j) = C(i-1, j-1) + C(i-1, j)
边界条件为: C(i, 0) = 1 (选择0个元素,只有一种情况)
C(i, i) = 1 (选择i个元素,只有一种情况)
根据递推关系,我们可以使用一个二维数组dp来保存子问题的解。
三、代码实现
#include <stdio.h>
long long combination(int n, int r) {
long long dp[n + 1][r + 1]; // 创建一个二维数组保存中间结果
// 计算组合数
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= r && j <= i; j++) {
if (j == 0 || j == i) {
dp[i][j] = 1; // 边界条件
} else {
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; // 递推关系
}
}
}
return dp[n][r]; // 返回计算结果
}
int main() {
int n, r;
scanf("%d %d", &n, &r);
long long result = combination(n, r);
printf("%lld",result);
return 0;
}
执行结果
结语
在任何一个你没有察觉的时刻
包括现在
通过行动去改变命运的机会
一直都存在
!!!