题面如图所示
思路
当盘子比苹果多–>必然有盘子是空的–>空盘子有没有都一样(因为没有顺序差别)–>直接把盘子变得和苹果一样多
当盘子不比苹果多–>可以做到让所有盘子都不空或者刻意让一些盘子空–>结果=让盘子空+不让盘子空
让盘子空–>当盘子只剩一个–>所有果子只放一个盘子–>一种可能
不让盘子空–>每个盘子都放一个–>当果子没了–>果子分完了–>一种可能
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
ll apple(ll m, ll n) {
if (m == 0 || n == 1)//果子没了或者盘子就一个了
return 1;//确定的一种可能
if (m < n) {//盘子比苹果多,按题目要求可以把空盘子去掉
return apple(m, m);
}
return apple(m, n - 1) + apple(m - n, n);//让盘子空+不让盘子空
}
int main() {
ll a, m, n;
cin >> a;
while (a--) {
cin >> m >> n;//m苹果数,n是盘子数
cout << apple(m, n) << endl;
}
return 0;
}
那么如果要把所有可能按照降序打印出来呢?