1. 程式人生 > >數的劃分與放蘋果問題

數的劃分與放蘋果問題

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 namespace
std; 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; }
View Code

數的劃分與放蘋果問題