數的劃分與放蘋果問題
阿新 • • 發佈:2018-10-07
display mes 劃分 none tdi lse isp nbsp code
將整數n分成k份,且每份不能為空,任意兩種劃分方案不能相同(不考慮順序)。
例如:n=7,k=3,下面三種劃分方案被認為是相同的。
1 1 5
1 5 1
5 1 1
問有多少種不同的分法。
* 本題類似n個蘋果放入m個盤子中
* 此基礎上加入盤子不能為空
* 思路:
* m個蘋果放在n個盤子中,那麽定義函數為apple(m,n):
* 1.m=0,沒有蘋果,那麽只有一種放法,即apple(0,n)=1
* 2.n=1,只有一個盤中,不論有或者無蘋果,那麽只有一種放法,apple(m,1)=1
* 3.n>m,和m個蘋果放在m個盤子中是一樣的,即apple(m,n)=apple(m,m)
* 4.m>=n,這時分為兩種情況:
* 一、所有盤子都有蘋果。
* 二、不是所有盤子都有蘋果。
* 不是所有盤子都有蘋果和至少有一個盤子空著是一樣的,即=apple(m,n-1)。
* 所有盤子都有蘋果,也就是至少每個盤子有一個蘋果,
* m個蘋果中的n個放在n個盤子中,剩下的m-n個蘋果,
* 這和m-n個蘋果放在n個盤子中是是一樣的,即=apple(m-n, n)。
* 這時,apple(m,n)=apple(m-n, n)+apple(m,n-1)。
#include <cstdio> #include <iostream> using namespaceView Codestd; int n, k; //a個蘋果放入b個盤子中 int dfs(int a, int b) { //沒有蘋果 和 只有一個盤子 if(a == 0 || b == 1) return 1; else if(a < b) //蘋果數 < 盤子數 等價於 蘋果數 == 盤子數 return dfs(a, a); else //(無空盤)先b果放b盤,再a-b果放b盤 + (至少有1個空盤)a果放b-1盤 return dfs(a-b, b) + dfs(a, b-1); } int main() { cin>>n>>k; cout<<dfs(n-k, k); //先每個盤子放個蘋果 就保證盤子不為空 return 0; }
數的劃分與放蘋果問題