給定正整數 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就可以通...