「分治演算法」解決「放蘋果問題」

2021-06-26 01:46:30 字數 980 閱讀 1183

題目:

把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個蘋果...