题意
m个苹果放n个盘子,苹果、盘子都一样,求情况总数。
想法
开始考虑递归状态f(m,n),表示m个苹果放n个盘子的情况数。转移时,一次枚举i个苹果装进1个盘子里。但为了使枚举情况有序,须设置一个枚举数量趋势(升序或降序),使得情况不会重复。所以最终状态为f(m,n,k),k为在此之前盘子中最大的苹果数,下一次枚举时,苹果数量大于等于k。
代码
#include<cstdio>
#include<iostream>
using namespace std;
int m,n;
int cases;
int f(int m,int n,int k){
if(m<k)return 0;/////重要!这种情况必须消灭,否则升序枚举将无法保持,造成情况重复
if(n==1||m==0)return 1;
int ans=0;
for(int i=k;i<=m;i++)
ans+=f(m-i,n-1,i);
return ans;
}
int main(){
cin>>cases;
while(cases--){
cin>>m>>n;
cout<<f(m,n,0)<<endl;
}
return 0;
}