有趣的组合问题
时间限制:500 ms | 内存限制:65535 KB
难度:2
-
描述
-
有n 种颜色的乒乓球,每种颜色的乒乓球的个数有任意多个,从中取m个球,问一共有多少种取法。
-
输入
- 每行2个正整数 n,m,(n,m)<32,以n和m都等于0结束。 输出
- 每组输出占一行,输出一共有多少种取法 样例输入
-
3 3 3 2 2 2 0 0
样例输出 -
10 6 3
-
思路:
-
dp[i][j] = dp[i - 1][j] + dp[i][j - 1].当从i种颜色里面取j个球的时候,分为是否包含第i种:
当至少含有一个第i种时,方法数就是在i种种选j - 1个(因为要保证至少有一个是第i种)
当不含有第i种的时候,方法数就是在i - 1中里面选出j个。
感觉有点像整数划分
<pre name="code" class="html">#include <stdio.h> long long dp[35][35]; //dp[n][m]表示n种颜色,取m个球 int main (void) { int i, j; for(i = 0; i < 35; i++) { dp[1][i] = 1;//一种颜色取i个球额,只有一种取法 dp[i][1] = i;//i种颜色取1个球,有i种取法 } for(i = 2; i < 35; i++) { for(j = 2;j < 35; j++) { dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; } } int n, m; while(scanf("%d %d", &n, &m) != EOF) { if(n == 0 && m == 0) break; printf("%lld\n", dp[n][m]); } return 0; }