题目:Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, …) which sum to n.
Example 1:
Input: n = 12
Output: 3
Explanation: 12 = 4 + 4 + 4.
Example 2:
Input: n = 13
Output: 2
Explanation: 13 = 4 + 9.
方法一:动态规划:
该问题可归纳为完全背包问题。
class Solution {
public:
int numSquares(int n) {
//map<int,int> sqT1;
vector<int> sqT1;
vector<int> sqn(n+1,0);
int cnt=1;
for(int i=1;i<=(n>>1);i++)
{
int m_multi = i*i;
if(m_multi==n)
return 1;
else if(m_multi>n)
break;
else
{
sqT1.push_back(m_multi);
}
}
sqn[0]=0;
for(int i=1; i<=n; i++)
{
sqn[i]=i;
for(int j=0; (j<sqT1.size()) && (sqT1[j]<=i); j++)
{
sqn[i]=min((sqn[i]),sqn[i-sqT1[j]]+1);
}
}
return sqn[n];
}
};
方法二:贪心算法加BFS
class Solution {
public:
int numSquares(int n) {
//map<int,int> sqT1;
vector<int> sqT1;
vector<int> sqn;
int cnt=1;
sqn.push_back(n);
for(int i=1;i<=(n<<1);i++)
{
int m_multi = i*i;
if(m_multi==n)
return 1;
else if(m_multi>n)
break;
else
{
sqT1.push_back(m_multi);
}
}
while(1)
{
cnt++;
int temp_size=sqn.size();
for(int i=0; i<temp_size; i++)
{
for(int j=0; j<sqT1.size(); j++)
{
if(sqn[0]>sqT1[j])
{
int temp=sqn[0]-sqT1[j];
for(int k=0; k<sqT1.size(); k++)
{
if(temp==sqT1[k])
return cnt;
}//在返回cnt值的时候,第一次采用在下一轮for的时候判断, 这样time会超时。因此需要提前判断temp值是否是一个平方数, 如果是,直接返回此时的cnt数即可
sqn.push_back(sqn[0]-sqT1[j]);
}
else
break;
}
sqn.erase(sqn.begin());
}
}
}
};