【2310. 个位数字为 K 的整数之和】背包

import java.util.*;

class Solution {
    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.minimumNumbers(58,9));
    }
    int ans = -1;
    public int minimumNumbers(int num, int k) {
        if( num == 0){
            return 0;
        }
        List<Integer> list = calculate(num,k);
        int[] arr = new int[list.size()];
        int[] dp = new int[num+1];
        Arrays.fill(dp,Integer.MAX_VALUE);

        for (int i = 0; i < list.size() ; i++) {
            arr[i] = list.get(i);
            dp[arr[i]] = 1;
        }

        for(int i=1;i<=num;i++){
            for(int j=0;j<arr.length;j++){
                if(dp[i] < Integer.MAX_VALUE && i+arr[j] <= num) {
                    dp[i+arr[j]] = Math.min(dp[i+arr[j]],dp[i]+1);
                }
            }
        }
        return dp[num]== Integer.MAX_VALUE?-1:dp[num];
    }


    public List<Integer> calculate(int num, int k){
        List<Integer> list = new ArrayList<>();

        if( k <= num){
            list.add(k);
        }

        int base = 1;
        for(int i=1;i<=3;i++){
            int nextbase =base*10;

            for(int x=base;x<=nextbase-1;x++){
                int tmp = x*10+k;

                if( tmp <= num){
                    list.add(tmp);
                }
            }

            base = nextbase;
        }

        return list;
    }
}

 

posted @ 2022-06-22 16:38  fishcanfly  阅读(41)  评论(0)    收藏  举报
//雪花飘落效果