经典题型 -- 兑换零钱

337 阅读1分钟

描述

给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。

如果无解,请返回-1.

示例1

输入:

[5,2,3],20

返回值:

4

示例2

输入:

[5,2,3],0

返回值:

0

示例3

输入:

[3,5],2

返回值:

-1

解题思路

以示例1 为例子,想要凑出20元,那就累积凑成1-20之间的所有金额最小需要的硬币数,累积最后可得出20的最小数量

import java.util.*;
public class Solution {
    public int minMoney (int[] arr, int aim) {
        //若aim小于0则返回-1;
        if(aim<1){
            return 0;
        }
        //凑成1-aim金额的数量
        int[] dp = new int[aim+1];
        Arrays.fill(dp,aim+1);
        dp[0]=0;
        for(int i=1;i<=aim;i++){
            //根据已有的金额硬币凑出i
            for(int j=0;j<arr.length;j++){
                if(arr[j]<=i){
                    //可以凑
                    dp[i] = Math.min(dp[i],dp[i-arr[j]]+1);
                }
            }
        }
        return dp[aim]>aim?-1:dp[aim];
    }
}