题目:
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
解题思路:
1.刚开始,我以为这是一道简单的排列组合问题,后来我发现事情并不简单
链接
2.网上的题解基本都是动态规划,我也没太搞懂为什么每个盘子拿掉一个苹果结果会不变
递推公式:f[m][n] = f[m][n - 1] + f[m - n][n]
3.我自己又想了一种笨方法:
把n个盘子当成n层递归,每一层选一定数量的苹果
选的过程中有两个限制就是,①当前层选取的苹果不能超过上一层的苹果,比如当上一层选了3,下一层就不能选4
②满足了递减的规则后还有一个规则就是,当前层如果选了一个很小的数量,后面即使全部选这个数量(因为后面不能再超过这个数字了)也不能用完还没有用的苹果
代码如下:
#include<iostream>
using namespace std;
int ans;
void lol(int last,int sum,int n) //上一层选的数量,还剩sum个苹果,第t层
{
if(n==1&&sum<=last)
{
ans++;
return;
}
for(int i=0;i<=sum&&i<=last;i++) //保证层与层之间递减的顺序
{
if((sum-i)/(n-1)+((sum-i)%(n-1)!=0)<=i) //保证后面层不会超过i,也可写成if(n*i>=sum)
{
lol(i,sum-i,n-1); //当前层选i
}
}
}
int main()
{
int t,m,n;
cin>>t;
while(t--)
{
ans=0;
cin>>m>>n;
lol(m,m,n);
cout<<ans<<endl;
}
return 0;
}
我tm心态崩了呀~