放蘋果問題 搜尋解法

2021-09-08 08:25:17 字數 1157 閱讀 5279

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

樣例輸入:

17 3

樣例輸出:

8感覺放蘋果問題還是挺有意思的,好幾種思想都能解。

#includeusing namespace std;

int a[1001] = ;

int m, n, tot;

void search(int i, int s)

} int main()

return 0;

}

函式search(int i, int s)   j表示第j個盤子,s表示要分配的蘋果數,陣列a[j]表示第j個盤子放的蘋果數。

這種解法的關鍵還是備註的地方,即每次放的蘋果數是大於等於上次放的數目。

也是通過j = a[i-1]; a[j] = j; 來實現。

i表示盤子數目的同時也意味他受n的約束,只有滿足小於等於n才算一次有效的放法。(這點也是用搜尋思想解自然數拆分問題與解本題的不同之處)

邏輯上for迴圈裡的if判斷我覺得是可有可無,因為j在迴圈裡只能小於等於s,而s永遠小於等於m。(我自己code的時候是沒敲出if的)

也是當時想不通為什麼答案要加if(j <= m) 就對實現的步驟多測試了下。加了兩條測試語句,並手寫輸出結果,來對比執行邏輯。對回溯過程的認識還是有幫助的。

手寫輸出時,一次執行中

search(7,1)//search(int i, int s)

函式當前的引數的值(7,1),與要呼叫的引數(8,1)之間的關係需注意。

for迴圈中的j的初值,以及是否滿足<=s的均需要注意。

每次回溯回來,s+=a[i]後,j++。

另外該**可小小優化下:

#includeusing namespace std;

int a[1001] = ;

int m, n, tot;

void search(int i, int s)

} int main()

return 0;

}

最短路徑問題 廣度優先搜尋解法

輸入乙個數值n,表示一塊nxn的區域,其中數值1表示訊號強,0表示訊號弱,例如 1 0 1 1 1 1 1 1 1 尋找所有訊號強的路徑 不包含0 中的最短路徑,並輸出其最短路徑的值,如果不存在最短路徑 到不了右下角 則輸出 1。思路 將整個nxn陣列建立成乙個二維圖,利用廣度優先搜尋演算法進行搜尋...

放蘋果問題

題目來自 總時間限制 1000ms 記憶體限制 65536kb 描述 把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?用k表示 5,1,1和1,5,1 是同一種分法。輸入第一行是測試資料的數目t 0 t 20 以下每行均包含二個整數m和n,以空格分開。1 m,n ...

放蘋果問題

問題描述 將m個蘋果放到n個空盤子中,允許盤子為空,允許乙個盤子放任意個蘋果,問總共有多少種放法。注意,不考慮盤子的次序,比如,將7個蘋果放到3個盤子中,5 1 1和1 5 1是同一種放法。解答 假設將m個蘋果放到n個盤子中的放法有f m,n 種,從最簡單的情況考慮起。當m 0或者n 0,f m,n...