题意理解:
给你一个整数
n
,返回 和为n
的完全平方数的最少数量 。完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,
1
、4
、9
和16
都是完全平方数,而3
和11
不是。从题目中可以理解: 元素是平方数,即1,4,9,...
元素可以使用无数次。
而整数n表示要使用平方数凑数来的目标。
则该问题是一个完全背包问题。
又因为,这里求凑出target的最少完全平方数,所以这里不是一个纯背包问题。
又因为,1+4+4 和4+1+4都是用了三个平方数,所以顺序是无关的,排列数和组合数都可以解决这个问题,即双for循环可以颠倒。
此外,如何遍历完全平方数呢?
我们可以采用for(int i=0;i<;i++) 完全平方数=i×i的方式来遍历。
因为要使用i×i来凑n,所以i一定<=
解题思路:
此题是一道完全背包问题,但是是非纯背包问题。因为这里求的是最少用几个元素,而不是最大价值。
这里的元素是i^2,其中i是[1,]的整数
目标值是target=n
元素可以无数次取用。
1.解题
public int numSquares(int n) {int dp[]=new int[n+1];Arrays.fill(dp,Integer.MAX_VALUE);dp[0]=0;for(int i=1;i<=Math.sqrt(n);i++){//遍历元素for(int j=1;j<=n;j++){if(Math.pow(i,2)<=j&&Integer.compare(Integer.MAX_VALUE,dp[j-(int)Math.pow(i,2)])!=0){dp[j]=Math.min(dp[j],dp[j-(int)Math.pow(i,2)]+1);}}}return Integer.compare(Integer.MAX_VALUE,dp[n])!=0?dp[n]:-1;}
2.分析
时间复杂度:O(n^2)
空间复杂度:O(n)