题解 | #兑换零钱#

兑换零钱

http://www.nowcoder.com/practice/67b93e5d5b85442eb950b89c8b77bc72

import java.util.Scanner;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        
        // 获取输入数据
        Scanner scan = new Scanner(System.in);
        String naim = scan.nextLine(); // 获取数组 arr 的长度和要找的钱数
        int n = Integer.valueOf(naim.split(" ")[0]); // 获取数组 arr 的长度
        int aim = Integer.valueOf(naim.split(" ")[1]); // 获取要找的钱数
        int[] coins = new int[n + 1]; // 定义一个整型数组,用于存放每种面值的货币
        String coinsString = scan.nextLine(); // 获取货币面值
        String[] consStrings = coinsString.split(" ");
        for (int i = 1; i <= n; i++) {
            coins[i] = Integer.valueOf(consStrings[i - 1]);
        }
        
        // 兑换零钱的动态规划的具体实现
        int[] dp = new int[aim + 1]; // 定义一个整型数组,用于存放需要找的钱数时,所需要的最少货币数
        Arrays.fill(dp, Integer.MAX_VALUE); // 初始化为 Integer.MAX_VALUE
        dp[0] = 0;
        for (int amount = 1; amount <= aim; amount++) {
            for (int coin : coins) {
                // 如果当前货币的面值大于要找的钱数,或者无法凑整
                if (coin > amount || dp[amount - coin] == Integer.MAX_VALUE) {
                    continue;
                }
                dp[amount] = Math.min(dp[amount - coin] + 1, dp[amount]);
            }
        }
        // 判断一下是否可以凑整,如果不可以凑整,直接返回 -1
        System.out.println(dp[aim] == Integer.MAX_VALUE ? -1 : dp[aim]);
    }
}
全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务