POJ1664 放苹果(递归)

69 篇文章 0 订阅

题意:

中文题,把m个苹果放入n个相同的盘子,盘子中可以不放苹果,问有几种方法

要点:

一开始我还以为是数学题,这不是组合概率问题吗?后来看网上的解释原来是递归:

用f(m)(n) 记录有几种方法:

1.m=1||n=1时都只有一种,f(m)(n)=1

2.m<n时,就相当于m个苹果放m个盘子,f(m)(n)=f(m)(m)

3.m=n时,有两种方式,第一种是每个盘子都放,只有全为1一种可能,第二种是至少一个盘子是空的,f(m)(n)=1+f(m)(n-1),我们只要算n-1的情况就好,因为n-1的情况本身包括放n-1和放n-2两种情况,这样一层层递归下去

4.m>n时,也分为两种情况:全放和至少一个没放,全放相当与先所有的盘子先放一个,再分配剩下的m-n个苹果,f(m)(n)=f(m-n)(n)+f(m)(n-1)


15124895Seasonal1664Accepted180K16MSC++436B2016-01-30 16:16:18
代码如下:

#include<stdio.h>
int f[15][15];

int put_apple(int m, int n)//有动态规划思想
{
	if (m == 1 || n == 1)
		f[m][n] = 1;
	else if (m < n)
		f[m][n] = put_apple(m, m);
	else if (m == n)
		f[m][n] = 1 + put_apple(m, n - 1);
	else if (m > n)
		f[m][n] = put_apple(m - n, n) + put_apple(m, n - 1);
	return f[m][n];
}
int main()
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		int m, n;
		scanf("%d%d", &m, &n);
		printf("%d\n", put_apple(m, n));
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值