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

来源:互联网 发布:青山软件造价 编辑:程序博客网 时间:2024/06/16 21:28

个题其实很简单,就是将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;}

原创粉丝点击