Leetcode 5218、个位数字为k的整数之和 (第298场周赛)
动态规划
预处理部分:找到所有满足条件的整数,所谓的条件就是小于等于给定的num且个位的数字是k。
正式的部分:动态规划五部曲:
- dp[i]代表:整数之和为i的最小整数个数;
- 递推公式:dp[i] = Math.min(dp[i], dp[i - n] + 1);前提是i - n必须可以由符合条件的整数相加得到;
- 初始化:dp[0]=0,和为0的整数个数为0;
- 遍历顺序:后面的需要依赖前面的,所以从前向后遍历;
- 举例验证,可以用debug的模式或者手动在草稿纸上面验证;
class Solution {
public int minimumNumbers(int num, int k) {
List<Integer> list = new ArrayList<>();
int index = k;
// 把所有符合条件的整数全部加到list里面。
while(index <= num) {
list.add(index);
index += 10;
}
int[] dp = new int[num + 1];
Arrays.fill(dp, Integer.MAX_VALUE);
dp[0] = 0;
for(int i = k; i <= num; i++) {
for(int n : list) {
if(i >= n && dp[i - n] != Integer.MAX_VALUE) {
dp[i] = Math.min(dp[i], dp[i - n] + 1);
}
}
}
return dp[num] == Integer.MAX_VALUE ? -1 : dp[num];
}
}