要把 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...