完美平方数:1,4,9,16,25,...
求一个数n最少由多少个完美平方数组成,假设q为sqrt(n):
- 如果这些数里面包含1,那么求出n-1*1最少由多少个完美平方数组成,然后加1就是结果
- 否则,如果这些数里面包含2,那么求出n-2*2最少由多少个完美平方数组成,然后加1就是结果
- ...
- 否则,如果这些数里面包含q,那么求出n-q*q最少由多少个完美平方数组成,然后加1就是结果
因此,这是一个动态规划问题。F(n) = min{F(n),F(n-1)+1,F(n-4)+1,...,F(n-q*q)+1}。如果递归求解会存在重复子问题,因此使用一个数组state保存状态,“从小到大”求出F(1)到F(n),结果就是state[n]