给定整数,找到若干个完全平方数(比如1,4,9,16,...)使得它们的和等于n。你需要让组成和的完全平方数的个数最小。
给你一个整数n,返回和为n的完全平方数的最小数量。
输入:12
输出:3
解释:4+4+4
---------------------------------------------------
输入:13
输出:2
解释:4+9
- 动态规划
- 最小数量,最大数量这种问题其实都可以考虑使用动态规划来做,类似于背包问题
- dp[i]表示的是当n等于i的时候完全平方数的最少数量
- dp[50] = min(dp[50],dp[50-7*7]+1)
- 实际60还可以有6*6+24进行组成
- 所以需要对这些进行遍历,然后取最小值即可
- dp[i]=min(dp[i],dp[i-j*j]+1)
- 确定动态转移方程了就可以写代码了
In [4]: def help(num):
...: dp = [0]*(num+1)
...: dp[0] = 0
...: for i in range(1,num+1):
...: dp[i] = i
...: j = 1
#对所有的可能性进行白能力,只要j*j<=i即可
...: while j*j<=i:
...: dp[i] = min(dp[i],dp[i-j*j]+1)
...: j+=1
...: return dp[-1]
...:
In [5]: help(12)
Out[5]: 3
In [6]: help(13)
Out[6]: 2
总结:背包问题一般都是用动态规划去解决,不过需要考虑的就是状态转移方程如何设置以及初始化的问题。