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