有趣的组合问题

本文介绍了一个经典的组合问题:从多种颜色的无限数量乒乓球中取出指定数量的球的不同组合方式。通过动态规划的方法给出了高效的解决方案,并提供了完整的C语言实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有趣的组合问题

时间限制: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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值