您的位置:首页 > Web前端

[LeetCode]Perfect Squares

2015-11-11 15:41 429 查看
题目链接:Perfect Squares

题目内容:

Given a positive integer n, find the least number of perfect square numbers (for example,
1,
4, 9, 16, ...
) which sum to n.

For example, given n =
12
, return
3
because
12
= 4 + 4 + 4
; given n =
13
, return
2
because
13
= 4 + 9
.

题目解法:
最初看到这个题,我想到的是回溯法,剪了半天的枝还是各种超时,后来参考了xudli的解法,才知道这道题用动态规划更合适。

我们设d[i]=a表示数字i对应的least number of perfect square numbers为a,则显然d[1]=1为初始条件,接着我们用背包问题的思想,对于i从2到n,尝试向其中放入perfect square number j,j从1开始枚举,每次放入后得到的结果为d[i - j*j]+1,也就是在不放入j的least number基础上+1得到d[i]的最小值,对于不同的j,我们应该选取其中最小的那个,也就是说:d[i]
= min{d[i-j*j],j=1,2,3...,j*j<=i}。

最后,d
就是结果。

代码如下:

class Solution {
public:
int getMin(int a, int b){
return a < b ? a : b;
}
int numSquares(int n) {
int *d = new int[n+1];
d[1] = 1; // d[i]表示数字i的Prefect Seuares值。
for(int i = 2; i <= n; i++){
int j = 1;
int min = 99999999;
while(j*j <= i){
if(j*j == i){
min = 1;
break;
}
min = getMin(min,d[i-j*j] + 1);
j++;
}
d[i] = min;
}
return d
;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: