M個蘋果放到N個相同盤子和N個不同盤子的解法

2021-09-21 14:58:11 字數 1525 閱讀 2961

題目很簡單:就是把m個蘋果放到n個盤子中,盤子可以為空,問你有多少種放法。

首先應該明白,盤子相同時三個盤子放1 1 5 和 5 1 1 是相同的,盤子不一樣時是不同的放法。

(1)放入相同盤子 蘋果為m, 盤子為n

放蘋果時分為兩種可能:一種是蘋果數大於等於盤子數,第二種是蘋果數小於盤子數。f(m,n)是求方法數的函式。

當m < n時,一定會有(n-m)個盤子空著,或者說至少會有(n-m)個盤子空著,這幾個盤子對於接下來的蘋果擺放一點影響都沒有,直接去掉他們。所以有了 return f(m, m); 剩下的盤子數等於蘋果數等於m.

當m >= n時,又可以分為兩類:一類時有盤子為空(也就是包含0),第二類時盤子都不為空(不包含0)。

第一類(含0):肯定至少有乙個盤子是空著的,所以就是 f(m, n-1)

第二類(不含0):先把每個盤子都放乙個蘋果,這放上去的n個蘋果對剩下的蘋果擺放沒有影響,直接去掉即可,所以有f(m-n, n);

遞迴出口:

n == 1 所有蘋果都放到乙個盤子裡 (這裡f(m,n)可以看作是把m個蘋果放到n個盤子上)

m == 0 沒有蘋果的時候

**:

int f(int m, int n)

else if (m < n)

else if (m >= n)

}

下面是志志的深搜方法,如果上面的看不懂可以試著理解理解這個。時間上比上面多一些。

void dfs(int x, int step, int y)

else if (x==m && step==n)

else }

}

(2)m個蘋果放到n個不同的盤子中

思路和盤子不同是差不太多,只是多了乙個組合數(在這裡用comd(n, m), 表示從n個中選出m個)。

開始分為兩種可能:

當 m < n 時,m個蘋果可以在n個盤子裡選m個,也就是comd(n, m)個,身下的(n-m)個盤子已經被考慮過了,而且不會影響接下來的擺放,直接去掉就行,所以方法數有 comd(n, m) * f(m, m)

當 m >= n時,分為有盤子為空(有0)和盤子均不為空(無0):

有0時:從n個盤子中選出乙個不放蘋果,有comd(n, 1)種選法,所以就是comd(n, 1) * f(m, n-1)

無0時,從m個蘋果中先拿出n個放滿盤子,這n個蘋果對後序擺放沒有一點影響,直接去掉就行,然後就變成了(m-n)個蘋果擺放在n個盤子問題 也就是 f(m-n, n)

遞迴出口(同盤子相同時一樣)

int f(int m, int n)

else if (m < n)

else if (m >= n)

}

組合數函式就需要你們自己搞了,不過我是咋打咋wa,最後還是用dfs才ac。

void dfs(int x, int step)

else if (x>n || step>m)

else }

}

m個蘋果放入n個盤子

放蘋果問題 把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?注 5,1,1和1,1,5是同一種分法 解題分析 設f m,n 為m個蘋果,n個盤子的放法數目,則先對n作討論,當n m 必定有n m個盤子永遠空著,去掉它們對擺放蘋果方法數目不產生影響。即if n m ...

Java簡單演算法 M個蘋果放到N個盤子問題

乙個簡單演算法題是 10個蘋果有多少種分法 整個 比如 1 1 8和 1 8 1 8 1 1是一樣的。它的本質還是m個蘋果和n個盤子的問題,這裡有個特殊的條件是m n。簡單分析下 m個蘋果 分成n份 第乙份是x1個,剩下的m x1個蘋果和n 1份 第二份是x2個,剩下的m x1 x2個蘋果和n 2份...

m個蘋果放入n個盤子問題

題目 把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?用k表示 5,1,1和1,5,1 是同一種分法。輸入每個用例包含二個整數m和n。0 m 10,1 n 10。0 n 10 m 10 解題思路 我們首先定義dp i j 表示i個蘋果,j個盤子的分法總數 1.當盤...