lc279 完全平方數

2021-10-17 06:49:42 字數 1792 閱讀 6897

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

輸入: n = 12

輸出: 3

解釋: 12 = 4 + 4 + 4.

輸入: n = 13

輸出: 2

解釋: 13 = 4 + 9.

numsquares(n)=min(numsquares(n-k) + 1) k是其中<=n的乙個完全平方數;遍歷每乙個k,找出min(numsquares(n-k) + 1

#include

"iostream"

#include

"vector"

#include

"cmath"

#include

"algorithm"

using

namespace std;

vector<

int>nums;

intminsquares

(int k)

}int minnum = int_max;

for(j =

0;j < nums.

size()

;j++

)return minnum;

}int

main()

cout <<

minsquares

(n)<< endl;

}

方法二 動態規劃法

儲存計算過程中的中間解,體現在dp陣列上;為了表示numsquares(n-k) + 1(當k==n時,也就是n本身就是個完全平方數的情況),應該初始化dp[0]=0;之後與暴力求解步驟幾乎相同。

int

main()

for(i=

1;i1;i++)}

cout << dp[n]

;return0;

}

在暴力遞迴時我們是從minsquares(n)->minsquares(n-1)->minsquares(n-2)…minsquares(1)

這個方法我們直接從平方數的個數入手,讓divide(n,count)表示 數n,由count個平方數組成;divide(n-k,count-1),表示數n,可以由原來的n,分為n-k和k,k和n-k的平方數個數最少為也就是count-1.

讓個數從1…n, 直到找到乙個count,使它符合每一項都是平方數。我們就可以直接跳出迴圈表示找到了。此時找到的就是最小個數。具體如下圖所示:注意體會count值的變化

//判斷某個數是不是完全平方數

return

false;}

bool

divided

(int n,

int count)

return

false;}

intmain()

int count;

for(count =

1;count <= n;count++)}

return0;

}

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就可以通...