放蘋果問題解題報告

2021-10-23 02:22:33 字數 2434 閱讀 3282

把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?(用k表示)5,1,1和1,5,1 是同一種分法。

輸入第一行是測試資料的數目t(0 <= t <= 20)。以下每行均包含二個整數m和n,以空格分開。1<=m,n<=10。

輸出對輸入的每組資料m和n,用一行輸出相應的k。

樣例輸入

17 3

樣例輸出

8分析:

一、遞迴法

顯然當蘋果數m或盤子數n為1時,只有一種放法。

當m或n不等於1時

分兩種情況討論:

一.蘋果數m《盤子數n,必然有空盤出現。例如3個蘋果放入7個盤子即使每盤放乙個還會空出4個盤子。此時把m個蘋果放入n個盤子和把m個蘋果放入m個盤子是一致的。即f(m,n)=f(m,m)

二.蘋果數m>=盤子數n

這種情況下又分為2種情況

1.有空盤

如果有空盤,那麼可以有很多個空盤,至少是空乙個。方法總數f(m,n)=f(m,n-1),為什麼是n-1呢,先空乙個。f(m,n-1)可以再討論看其能不能再空乙個出來,能即繼續f(m,n-1)=f(m,n-2);不能,說明盤子數為已經減少到1了。

2.無空盤

無空盤說明盤子裡肯定有蘋果。至少有乙個,也可以有很多個只要滿足盤子都有蘋果。

此時蘋果數m必然》=盤子數n(不然肯定有空盤出現),舉例把7 個蘋果放入3 個盤子,我們來思考既然不允許有空盤每盤至少有乙個,我們把每盤先放入乙個蘋果(目的是符合題意使得盤子都在用,不空盤)。這時,還剩7-3=4個蘋果。關鍵點來了!由於蘋果都一樣,盤子都一樣(題意),這時放入盤子那個蘋果和盤子本身已經融為一體(可以看成乙個無差別整體)即把7個蘋果放入3個盤子的方法數f(7,3)=有空盤f(7,2)與無空盤f(4,3)的方法數之和。此時還剩的4個蘋果仍然多於盤子數。按此思路可以每盤再放入這1個蘋果,還剩1個蘋果。即f(4,3)=有空盤f(4,2)與無空盤f(1,3)的和。至於現在的f(1,3)由於m為1,所以f(1,3)方法數為1,即f(1,3)=1,對f(1,3)不必繼續討論。

因此f(7,3)=f(7,2)+f(4,3)=f(7,2)+f(4,2)+f(1,3)

下面對這個式子中m或n不為1的情況繼續討論。

按照上面的思路把這式子展開:

f(7,2)=f(7,1)+f(5,2) f(5,2)=f(5,1)+f(3,2) f(3,2)=f(3,1)+f(1,2)

f(4,2)=f(4,1)+f(2,2) f(2,2)=f(2,1)+f(0,2)(說明:蘋果數和盤子數一致時。我們討論2個蘋果放入2個盤子,方法數等於2種情況的和。即有空盤(空乙個盤子)f(2,1)+無空盤此時m=0時(已經每盤放乙個),方法數為1,所以f(0,2)=1

用畫圖來表示:

通過上面圖我們可以得到:

f(7,3)=f(7,1)+f(5,1)+f(3,1)+f(1,2) +f(4,1)+f(2,1)+f(0,2)+f(1,1)=1+1+1+1+1+1+1+1=8種。

綜上:通過上面的討論:m與n的關係為:

if(m等於1||m等於0||n==1) f(m,n)=1;

if(m=n) f(m,n)=f(m,n-1)+f(m-n,n);

將上述過程繼續重複分解最終使得f(m,n)的展開式中所有的m都為0或1,或n為1為止。

下面寫出遞迴**:

#include

using namespace std;

int f(int m,int n)

for(int i=2;i<=10;i++)

for(int j=2;j<=10;j++)

if(i>t;

for(int i=1;i<=t;i++)

{cin>>m>>n;

cout三、回溯法

這道題也可以用回溯法來解決,回溯法屬於遞迴形式的dfs深搜。

回溯演算法也叫試探法,它是一種系統地搜尋問題的解的方法。實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就「回溯」返回,嘗試別的路徑。回溯法是一種選優搜尋法(選優其實就是先定下某種策略,如每次都按上下左右順序進行試探),按選優條件向前搜尋,以達到目標或無解。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。由於走不通即回溯一步的特點其時間複雜度把列舉法的n的n次方降為n!而被廣泛使用。許多複雜的,規模較大的問題都可以使用回溯法,有「通用解題方法」的美譽。

用回溯演算法解決問題的一般步驟:

1、 針對所給問題,定義問題的解空間,它至少包含問題的乙個(最優)解。

2 、確定易於搜尋的解空間結構,使得能用回溯法方便地搜尋整個解空間 。

3 、以深度優先的方式搜尋解空間,並且在搜尋過程中用利用剪枝避免無效搜尋。(關於剪枝視情況而用,這道題無需剪枝,也不能剪枝。因為題目並沒有限定特別條件)

poj1664 放蘋果 解題報告

描述 把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?用k表示 5,1,1和1,5,1 是同一種分法。輸入第一行是測試資料的數目t 0 t 20 以下每行均包含二個整數m和n,以空格分開。1 m,n 10。輸出 對輸入的每組資料m和n,用一行輸出相應的k。樣例輸入...

POJ 1664 放蘋果 解題報告

這是一道求總方案數的dp,唯一的不同就是2,5這種放法和5,2是一樣的,於是這道題就變成了把整數n分成非負整數m份,有多少種分法,寫轉移方程式的時候要仔細思考思考。用s i j 表示用i個盤子放j個蘋果的不重複的總方案數。處理邊界 s 1 k 1 0 k m s 1 k 很顯然只有一種方法。s i ...

POJ1664放蘋果 解題報告

一道遞迴裸題。直接上 了 特別注意遞迴條件的判讀,一開始沒有考慮到盤子數為1的情況。只考慮蘋果為0了。include using namespace std int get res int m,int n if m n mreturn get res m,m else 如果水果多 get res m...