題目:
把n個同樣的蘋果放在m個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?(用k表示)5,1,1和1,5,1 是同一種分法。
input
第一行是測試資料的數目t(0 <= t <= 20)。以下每行均包含二個整數m和n,以空格分開。1<=m,n<=10。
output
對輸入的每組資料n和m,用一行輸出相應的k。
sample input
17 3
sample output
8思路:
n個蘋果放在m個盤子裡,記為c(n,m),可遞迴為c(n,m-1)+c(n-m,m)。c(n,m-1)表示n個蘋果放入m-1個盤子的情況;而c(n-m,m)則表示n個蘋果放滿m個盤子,之所以為「n-m」,是因為先把n個蘋果每個盤子都放乙個,所以就剩下n-m個蘋果。
但是,當「m>n」時,n個蘋果無法
放滿m個盤子,所以此時只需「return c(n,n-1)」。
接下來在考慮分解條件,當「n<=1||m<=1」時,只有一種情況,故 return 1;
綜上所述,可得以下表示式:
n<=1或m<=1 return 1;
m>n return c(n,n-1);
m<=n return c(n,m-1)+c(n-m,m);
接下來就是**:
[cpp]view plain
copy
//from big_heart
#include
using
namespace
std;
intc(
int,
int);
inti=0;
void
main()
} int
c(int
n,int
m)
演算法練習 1 放蘋果(分治演算法)
首先談談分治演算法為何物。在電腦科學中,分治法是一種很重要的演算法。字面上的解釋是 分而治之 就是把乙個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題 直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。這個技巧是很多高效演算法的基礎,如排序演算法 快速排序,歸...
演算法 放蘋果問題
1.在說放蘋果問題之前,先說下斐波那契數列遞迴求解時的時間複雜度。由公式f n f n 1 f n 2 很容易畫出其遞迴樹 每個節點都會呼叫一次f n 滿二叉樹節點數m 2 h 1,h是樹高度。則o n 2 n.2.放蘋果問題 把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種...
演算法 放蘋果
把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?用k表示 5,1,1和1,5,1 是同一種分法。第一行是測試資料的數目t 0 t 20 以下每行均包含二個整數m和n,以空格分開。1 m,n 10。對輸入的每組資料m和n,用一行輸出相應的k。設f m,n 為m個蘋果...