poj 1664 整数划分

 

根据题意,将n个苹果放入m个盘子中,盘子样式相同,求所有方法。

这是一个典型的整数划分问题

1.n == 1  只有一个苹果,由于盘子样式相同,那么放在哪个盘子中都是一种放法,fun(n,m) = 1

2.m == 1  只有一个盘子,将所有苹果放到那个盘子中  fun(n,m) = 1

3.n < m    盘子数比苹果数多,最多把n个苹果放到n个盘子中  fun(n,m) = fun(n,n)

4.n == m   盘子数等于苹果数,第一种情况每个盘子放一个苹果,第二种情况在至少一个盘子不放苹果的情况下,fun(n,m) = fun(n,m-1)  所以fun(n,m) = 1 + fun(n,m-1)

5.n <= m   第一种情况至少一个盘子不放苹果,fun(n,m) = fun(n,m-1)    第二种情况所有盘子都有苹果,将每个盘子苹果拿出一个,再将n-m个苹果放到m个盘子中 fun(n,m) = fun(n-m,m)  所以fun(n,m) = fun(n-m,m) + fun(n,m-1)

 

#include<iostream>
using namespace std;

int fun(int a,int b)
{
    if(a==1||b==1)
        return 1;
    if(a < b)
        return fun(a,a);
    if(a == b)
        return 1 + fun(a,b-1);
    return fun(a,b-1) + fun(a-b,b);
}

int main()
{
    int count,a,b;
    cin >> count;
    while(count--)
    {
        cin>>a>>b;
        cout<<fun(a,b)<<endl;
    }
    return 0;
}

 

posted @ 2018-02-26 21:00  ZZUGPY  阅读(97)  评论(0编辑  收藏  举报