题意

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;
}
 posted on 2017-01-29 17:00  cylcy  阅读(100)  评论(0编辑  收藏  举报