放苹果 - 题解

放苹果

时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 256MB,其他语言 512MB

描述

\(M\) 个同样的苹果放在 \(N\) 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)\(5,1,1\)\(1,5,1\) 是同一种分法。

输入描述

第一行是测试数据的数目 \(t\)\(0≤t≤20\))。
以下每行均包含二个整数 \(M\)\(N\),以空格分开。\(1≤M,N≤10\)

输出描述

对输入的每组数据 \(M\)\(N\),用一行输出相应的 \(K\)

用例输入 1

1
7 3

用例输出 1

8

提示

代码

递归 做法

#include<cstdio>
using namespace std;

int ans=0;
void solve(int m,int n,int p,int last)
{
	if(m<0) return;
	if(p==n)
	{
		if(m>=last) ans++;
	}
	else
	{
		for(int i=last;i<=m;i++)
			solve(m-i,n,p+1,i);
	}
	return;
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int m,n;
		scanf("%d%d",&m,&n);
		ans=0;
		solve(m,n,1,0);
		printf("%d\n",ans);
	}
	return 0;
}

动态规划 做法

#include<cstdio>
#include<cstring>
using namespace std;

const int M=15,N=15;
int T,m,n,f[M][N];

int main()
{
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&m,&n);
		memset(f,0,sizeof(f));
		for(int i=1;i<=m;i++) f[i][1]=1;
		for(int i=1;i<=n;i++) f[0][i]=f[1][i]=1;
		for(int i=2;i<=m;i++)
			for(int j=2;j<=n;j++)
			{
				if(i>=j) f[i][j]=f[i][j-1]+f[i-j][j];
				else f[i][j]=f[i][i];
			}
		printf("%d\n",f[m][n]);
	}
	return 0;
}
posted @ 2024-07-29 23:39  Jerrycyx  阅读(15)  评论(0编辑  收藏  举报