leetcode第279题完全平方和
好明显的完全背包:
- 这不是和兑零钱是一样的么, 找兑换该钱最小的纸币数,这不也是一样的?
- 只是货币的价值没有直接给出,但是依旧可以依靠索引获取当前的纸币面值
思路分析:
-
dp数组的定义:和为j的完全平方和的最小数量为dp【j】
-
dp数组的初始化:任意一个数都设为Integer.MAX_VALUE dp【0】 = 0
-
状态转移方程:dp【j】 = Math.min(dp[j],dp[j - i * i] + 1);
class Solution { 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 * i <= n;i++){ for(int j = i * i;j <= n;j++){ if(dp[j - i * i] != Integer.MAX_VALUE){ dp[j] = Math.min(dp[j],dp[j - i * i] + 1); } } } return dp[n]; } }