m 公升的水倒入 n 個相同的容器 容器無限大

2021-07-10 21:14:08 字數 1637 閱讀 1180

要把 m 公升的水倒入 n 個相同的容器中(假設容器足夠大),允許有的容器是空的,問共有多少種不同的倒法?(用k表示)5,1,1和1,5,1和 1,1,5 是同一種倒法。 input: 第一行是測試資料的數目 x(0 <= x <= 20)。以下每行均包含二個整數m和n,以空格分開。1<=m,n<=10。 output: 對輸入的每行資料m和n,用一行輸出相應的k。

1

7 3

8
我們以輸入樣例舉例子,假設有7公升水,3個容器。我們手動的寫出它所有的組合。分3種情況:

用乙個容器

7、0、0
只有這一種組合

用兩個容器

1、6

2、53、4

有上面三種組合

用三個容器

1、1、5

1、2、4

1、3、3

2、2、3

一共有四種組合

我們用 f(m,n) 來表示 m 公升水倒入 n 個容器的組合數

那麼樣例輸入的例子可以表示為 f(7, 3)

7公升水裝入乙個容器

我們很容易想到的表示式為 f(7,1),並且 f(7, 1) = 1

7公升水裝入兩個容器

裝入兩個容器的意思是這兩個容器中水的容量至少為1公升。那麼我們先把 7 公升水拿出 2 公升放入這兩個容器中,則問題可以轉化為 5 公升水放入這 2 個容器中,即 f(5,2)

7公升水裝入三個容器

按照上面的思想,我們先拿出 3 公升水裝入這 3 個容器中,剩下 4 公升水,那麼問題可以轉化為 f(4,3)

通過上面的分析我們可以得出乙個結論:

f

(7,3) = f

(7,1) + f

(5,2) + f

(4,3)

那麼推廣到 f(m,n):

f(m,n) = f(m,1) + f(m-2,2) + f(m-3,3) + ... + f(m-n,n)
可以得出,我們可以用遞迴來解決這個問題

對於 f(m,n) 來說

m = 1  f(1,n) = 1;

n = 1 f(m,1) = 1;

m < n n = m; //如 f(2,3) 與 f(2,2) 的結果是一樣的

public

class main

}public

intfun(int m, int n)

return sum;

}}

輸入
d

:/data17

3

輸出
fun

(7,3)

fun(7,1)

fun(5,2)

fun(5,1)

fun(3,2)

fun(3,1)

fun(1,2)

fun(4,3)

fun(4,1)

fun(2,2)

fun(2,1)

fun(0,2)

fun(1,3)

8

m個相同蘋果放的n個相同盤子中的演算法

m個相同的蘋果,放在n個相同的盤子中,由於相同,使用排列組合的方法不好處理。這個問題困擾了我很久 最後由大神 或缺 給出了答案 以8個蘋果放在3個盤子中為例 思路 8蘋果3盤子 8蘋果2盤子 5蘋果2盤子 每盤已經放入1個 2蘋果2盤子 每盤已經放入3個 8蘋果1盤子 6蘋果1盤子 每盤已經放入1個...

盛最多水的容器

給定 n 個非負整數 a1,a2,an,每個數代表座標中的乙個點 i,ai 畫 n 條垂直線,使得垂直線 i 的兩個端點分別為 i,ai 和 i,0 找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。注意 你不能傾斜容器,n 至少是2。乍一看很簡單,巢狀迴圈遍歷就完事了 int m...

盛最多水的容器

題目描述 給定 n 個非負整數 a1,a2,an,每個數代表座標中的乙個點 i,ai 在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 i,ai 和 i,0 找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水 說明 你不能傾斜容器,且 n 的值至少為 2。示例 輸入 1,8,6...