思路
- dp数组定义:和为 j 的完全平方数的最少数量
- 递推公式:dp[j] = min(dp[j], dp[j-nums[i]] + 1 );
- dp数组初始化:dp[0] = 0;
- 遍历顺序:不涉及组合排列,先物品先背包都可,由于是完全背包所以第二层是顺序
- 时间复杂度:
代码
class Solution {
public:
int numSquares(int n) {
vector<int> nums;
for(int i = 1; i <= 1000; i++){
if(i*i > n){
break;
}
nums.push_back(i*i);
}
vector<int> dp(n+1, INT_MAX);
int m = nums.size();
dp[0] = 0;
for(int i = 0; i < m;i++){
for(int j = 0; j <= n;j++){
if(j >= nums[i]){
dp[j] = min(dp[j], dp[j-nums[i]] + 1 );
}
}
}
return dp[n];
}
};