poj 1664__放苹果,整数的分拆


个题其实很简单,就是将m个相同的苹果放入相同的盘子里,问有多少种放法。

我想先对这个题进行一点的修改,如果放入不同的盘子里,那么结果就是x1+x2+x3+...+xn=m的解的个数,组合数学上叫多重集合的组合问题。

如果盘子不同,且盘子非空,那么这个就是整数的有序分拆。也就是多重集合的组合中每一个至少出现一次的那个结果。

而这个题中盘子是相同的,就是整数的无序分拆问题了。

n的k分拆是说,将n分成k个大于0的数。

整数的无序分拆中有一个公式是:B(n+k,k) = B(n,1)+B(n,2)+B(n,3)+~~~B(n,k);

其中B(n,k)表式n的k分拆。

要上课了,贴一下代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

int data[30][30];
int get(int m,int k)
{
    if(data[m][k] != -1) return data[m][k];
    if(k == 1 || m == k) return 1;
    if(m < k) return 0;
    int sum = 0;
    for(int i = 1;i <= k;i++)
    {
        sum += get(m-k,i);
    }
    data[m][k] = sum;
    return sum;
}
int main()
{
    int t;
    cin >> t;
    memset(data,-1,sizeof(data));
    while(t--)
    {
        int m,k;
        cin >> m >> k;
        int sum = 0;
        for(int i = 1;i <= k;i++)
            sum += get(m,i);
        cout << sum << "\n";
    }
    return 0;
}

你可能感兴趣的:(poj 1664__放苹果,整数的分拆)