Luogu 普及- (递归)

放苹果

题目描述

\(m\) 个同样的苹果放在 \(n\) 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法。(\(5,1,1\)\(1,1,5\) 是同一种方法)

输入格式

第一行是测试数据的数目 \(t\),以下每行均包括二个整数 \(m\)\(n\),以空格分开。

输出格式

对输入的每组数据 \(m\)\(n\),用一行输出相应的结果。

样例 #1

样例输入 #1

1
7 3

样例输出 #1

8

样例 #2

样例输入 #2

3
3 2
4 3
2 7

样例输出 #2

2
4
2

提示

对于所有数据,保证:\(1\leq m,n\leq 10\)\(0 \leq t \leq 20\)

#include<bits/stdc++.h>
using namespace std;

vector<int>a;

int apple(int m,int n,int pre) {
	if(m==0 && n>0) return 0; //如果没有苹果 但是有盘子 +0 
	if(m>0 && n==1) {  //如果有苹果 同时盘子==1 
		if(m<pre) { //如果剩余苹果 比 上一次放置 数量少 
			return 0; // +0 
		}else{
			return 1; //如果有苹果 同时 盘子==1 同时  剩余苹果 比 上一次放置 数量少  +1
		}
	}
	int ans = 0;
	for(int i=pre; i<=m; i++) { //在当前盘子中可以放置 i 个苹果 
		a.push_back(i);
		ans+=apple(m-i,n-1,i);
		a.pop_back();
	}
	return ans;
}

int main() {
	int q;
	cin>>q;
	int m,n;
	while(q--) {
		cin>>m>>n;
		cout<<apple(m,n,0)<<endl;
	}
	return 0;
}
posted @ 2024-08-08 16:54  ppppppro  阅读(39)  评论(0)    收藏  举报