https://leetcode-cn.com/problems/perfect-squares/
思路:做法挺多的,就说一下dp吧。类似于完全背包的做法,只不过现在是求最小个数。用
d
p
i
dp_i
dpi表示表示正整数
i
i
i所需要的最少个数,那么对于每个满足题意的完全平方数
x
x
x,有:
d
p
i
=
m
i
n
(
d
p
i
,
d
p
i
−
x
+
1
)
dp_i=min(dp_i,dp_{i-x}+1)
dpi=min(dpi,dpi−x+1)
class Solution {
public:
int numSquares(int n) {
vector<int> nums,dp(n+1,0x3f3f3f3f);
for(int i=1;i*i<=n;i++)
nums.push_back(i*i);
dp[0]=0;
int len=nums.size();
for(int i=0;i<len;i++)
{
for(int j=nums[i];j<=n;j++)
dp[j]=min(dp[j],dp[j-nums[i]]+1);
}
return dp[n];
}
};