279 完全平方數(BFS)

2021-10-11 06:00:32 字數 1173 閱讀 2780

給定正整數 n,找到若干個完全平方數(比如 1, 4, 9, 16, …)使得它們的和等於 n。你需要讓組成和的完全平方數的個數最少。

這題有兩種解法,①bfs ②動態規劃

1、

這題用bfs解題的關鍵是如何把題目要求轉換成資料結構–「圖」。

我們這裡用的轉換條件是以0作為根節點,它的子節點應該滿足(i*i)+0(poll:被放入到佇列中的元素)<=n注:(1<=i<=n)

如果滿足該要求,那麼才可以和0之間有連線。其它的以此類推,來建立起來這個圖的模型。

只要建立起模型了,就可以直接套用bfs解題模板了。

這題其實可以看成完全揹包問題,完全平方數就是物品(可以無限件使用),湊個正整數n就是揹包,問湊滿這個揹包最少有多少物品?

dp[i]:和為i的完全平方數的最少數量為dp[i]

主要講解一下狀態轉移方程:

dp[j] 可以由dp[j - i ✖️ i]推出, dp[j - i ✖️i] + 1 便可以湊成dp[j]。

此時我們要選擇最小的dp[j],所以遞推公式:dp[j] = min(dp[j - i * i] + 1, dp[j]);

class

solution

if(target < n &&

!visited.

contains

(target))}

}}return-1;}}

class

solution

dp[0]

=0;// 題目給的是非0完全平方數, 因此n = 0時是0種

//外層遍歷物品

for(

int i =

1; i * i <= n; i++)}

return dp[n]

;// 返回結果

}}

279 完全平方數

給定正整數 n,找到若干個完全平方數 比如 1,4,9,16,使得它們的和等於 n。你需要讓組成和的完全平方數的個數最少。示例 1 輸入 n 12 輸出 3 解釋 12 4 4 4.示例 2 輸入 n 13 輸出 2 解釋 13 4 9.其中dp i 表示正整數i最少能由多個完全平方數組成,那麼我們...

279 完全平方數

給定正整數 n,找到若干個完全平方數 比如1,4,9,16,使得它們的和等於n。你需要讓組成和的完全平方數的個數最少。示例 1 輸入 n 12輸出 3解釋 12 4 4 4.示例 2 輸入 n 13輸出 2解釋 13 4 9.動態規劃 class solution return dp n 使用佇列輔...

279 完全平方數

include include include using namespace std class solution return res int main 把這個問題轉換為乙個無權圖找最短路徑以後,因為有很多路徑可以到達乙個同乙個節點 12 1 11 4 7 12 4 8 1 7 比如12就可以通...