今天重新看整數划分想到了poj1664,寫一下解題報告,免得總忘。
歸結為各種分配問題:
M個蘋果放入N個盤子里

#include<cstdio>
#include<iostream>
#include<cstdlib>
using namespace std;
int f (int m, int n){
if (m<0)
return 0;
if (n==1||m==0)
return 1;
return f(m-n,n)+f(m,n-1);
}
int main (){
int t, m, n;
cin>>t;
while(t--){
cin>>m>>n;
cout<<f(m,n)<<endl;
}
return 0;
}
f(m-n,n):每個盤子都有蘋果
= 1 // m== 0 || n == 1
= 0 // m < 0
r!*S(n,r)
問題1:
m----->相同, n---> 相同,可為空
將m個蘋果放進n個盤子中,盤子允許空,有多少種方法。同時注意例如1、2和2、1這兩種方案是一種方案。
思路:
其實這跟將一個整數m分成n個整數之和是類似的,
設f[m][n]為將m分成最多n份的方案數,且其中的方案不重復,每個方案前一個份的值一定不會比后面的大。
則有:f[m][n] = f[m][n - 1] + f[m - n][n];
= 1 // m== 0 || n == 1
= 0 // m < 0
f[m][n - 1]相當於第一盤子中為0,只用將數分成n - 1份即可。
因為0不會大於任何數,相當於f[m][n - 1]中的方案前面加一個為0的盤子,
而且不違背f的定義。所以f[m][n - 1]一定是f[m][n]的方案的一部分,即含有0的方案數。
f[m - n][n]相當於在每個盤子中加一個數1。因為每個盤子中加一個數1不會影響f[m][n - 1]中的方案的可行性,也不會影響f的定義。
所以f[m - n][n]一定是f[m][n]的方案的一部分,即不含有0的方案數。
問題2:
問題描述:將整數N分成K個整數的和 且每個數大於等於A
小於等於B 求有多少種分法
- int Dynamics(int n, int k, int min) //將n分為k個整數 最小的大於等於min,最大不超過B
- {
- if(n < min) return 0;//當剩下的 比min小,則不符合要求 返回0
- if(k == 1) return 1;
- int sum = 0;
- for(int t = min; t <= B; t++)
- {
- sum += Dynamics(n-t, k-1, t);
- }
- return sum;
- }
問題3:
m----->相同, n---> 相同,不能為空
將m個蘋果放進n個盤子中,有多少種方法。同時注意例如1、2和2、1這兩種方案是一種方案。
思路:
先把每個都放一個蘋果,這樣問題就轉化為:m-n個蘋果放進n個盤子里,盤子允許空,即問題1
問題4:
第一類Stirling數是有正負的,其絕對值是包含n個元素的集合分作k個環排列的方法數目。
遞推公式為,
S(n,0) = 0, S(1,1) = 1.
S(n,k) = S(n-1,k-1) + (n-1)S(n-1,k)。
n個元素的集合分作k個環排列的方法是s(n,k),那么
1.可由前n-1個元素k-1個環的s(n-1,k-1); 即最后一個元素為單環,前n-1個構成k-1環;
2.第n個元素一定不是單環,可以由n-1個元素k個環,把第n個數任意的放入一個環中組成新環!即得到n個
元素的集合分作k個環,假設n個元素的集合分作k個環,那么由於n,不在單環中,那么可以把n所在的環中把n
剔除,即得到了n-1個元素,k個環,即充分與必要性都得證!
因而:S(n,k) = S(n-1,k-1) + (n-1)S(n-1,k)。得證!
問題5:
第二類Stirling數是把包含n個元素的集合划分為正好k個非空子集的方法的數目。
//n->有區別,K->非空,沒區別
遞推公式為,
S(n,n) = S(n,1) = 1,
S(n,k) = S(n-1,k-1) + kS(n-1,k).
上面的遞推式可以用組合證明:
一方面,如果將第n個元素單獨拿出來划分成1個集合,那么方法數是S(n-1,k-1);
另一方面,如果第n個元素所在的集合不止一個元素,那么可以先將剩下的n-1個元素划分好了以后再選一個集合把第n個元素放進去,方法數是k*S(n-1,k);
有加法原理得證
問題6:
Bell數和Stirling數
B(n)是包含n個元素的集合的划分方法的數目。
集合的划分:非空,
B(0) = 1, B(1) = 1,
B(n) = Sum(1,n) S(n,k). 其中Sum(1,n)表示對k從1到n求和,
問題7:
當K是有區別的時候,則一般都要在沒有區別的基礎上乘以K的全排列。