我想先对这个题进行一点的修改,如果放入不同的盘子里,那么结果就是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; }