题意:给你一个正整数,求至少多少个完全平方数加起来的和等于这个正整数
#include<iostream>
#include<vector>
#include<math.h>
#include <algorithm>
using namespace std;
//方法一:dfs暴力求解发,出现TLE问题
class Solution {
public:
int numSquares(int n) {
int num = 0;
int min = n;
int Solve = static_cast<int>(sqrt(static_cast<double>(n)));
dfs(n, num, Solve, min);
return min;
}
void dfs(int n, int num, int Solve, int& min) {
if (n == 0) {
min = num < min ? num : min;
return;
}
num += 1;
if (Solve * Solve == n) {
min = num < min ? num : min;
return;
}
while (Solve * Solve > n) {
Solve -= 1;
}
for (int i = Solve; i >= 1; i--) {
dfs(n - i * i, num, i, min);
}
}
};
//方法二:背包问题方法(完全背包)
class Solution {
public:
int numSquares(int n) {
int num = 0;
int Solve = static_cast<int>(sqrt(static_cast<double>(n)));
if (Solve * Solve == n) return 1;
vector<vector<int>> dp(Solve + 1, vector<int>(n + 1, n));
for (int i = 0; i <= n; i++) {
dp[1][i] = i;
}
for (int i = 0; i <= Solve; i++) {
dp[i][0] = 0;
}
for (int i = 1; i <= Solve; i++) {
for (int j = 1; j <= n; j++) {
if (i * i > j) dp[i][j] = dp[i - 1][j];
else {
dp[i][j] = min(dp[i][j - i * i] + 1, dp[i - 1][j]);
}
}
}
return dp[Solve][n];
}
};
//方法三:BFS+贪心算法,非常牛逼,时间上击败了百分之95的人
class Solution {
public:
int numSquares(int n) {
int num = 0;
int Solve = static_cast<int>(sqrt(static_cast<double>(n)));
bool Findit = false;
//最贪心,一次就出去
if (Solve * Solve == n) return 1;
//贪心,按照2,3,4,,,所需要最少个数的顺序
for (int i = 2; i <= n; i++) {
for (int j = Solve; j >= 1; j--) {
if (!Findit)
DevideBy(n - j * j, i - 1, Findit);
else
return i;
}
}
return n;
}
void DevideBy(int Value, int num, bool& Findit) {
if (Value == 0) {
Findit = true;
return;
}
if (num == 0) return;
int Solve = static_cast<int>(sqrt(static_cast<double>(Value)));
for (int j = Solve; j >= 1; j--) {
if (!Findit)
DevideBy(Value - j * j, num - 1, Findit);
}
}
};