我是靠谱客的博主 谨慎往事,最近开发中收集的这篇文章主要介绍换钱的方法数-Java:时间复杂度为O(N*aim)的动态规划方法再结合空间压缩的技巧,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击http://www.captainbed.net

package live.every.day.ProgrammingDesign.CodingInterviewGuide.RecursionAndDynamicPrograming;

/**
 * 换钱的方法数
 *
 * 【题目】
 * 给定数组arr,arr中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim
 * 代表要找的钱数,求换钱有多少种方法。
 *
 * 【难度】
 * 中等
 *
 * 【解答】
 * 时间复杂度为O(N*aim)的动态规划方法再结合空间压缩的技巧。空间压缩的原理请参考"矩阵的最小路径和"问题,这里不再详述。请
 * 参看如下代码中的coins5方法。
 * 至此,我们得到了最优解,是时间复杂度为O(N*aim)、额外空间复杂度O(aim)的方法。
 *
 * @author Created by LiveEveryDay
 */
public class ChangeMoneyMethodNumber5 {

    public static int coins5(int[] arr, int aim) {
        if (arr == null || arr.length == 0 || aim < 0) {
            return 0;
        }
        int[] dp = new int[aim + 1];
        for (int j = 0; arr[0] * j <= aim; j++) {
            dp[arr[0] * j] = 1;
        }
        for (int i = 1; i < arr.length; i++) {
            for (int j = 1; j <= aim; j++) {
                dp[j] += j - arr[i] >= 0 ? dp[j - arr[i]] : 0;
            }
        }
        return dp[aim];
    }

    public static void main(String[] args) {
        int[] arr = {2, 5, 3};
        int aim = 10;
        System.out.printf("The method number is: %d", coins5(arr, aim));
    }

}

// ------ Output ------
/*
The method number is: 4
*/

最后

以上就是谨慎往事为你收集整理的换钱的方法数-Java:时间复杂度为O(N*aim)的动态规划方法再结合空间压缩的技巧的全部内容,希望文章能够帮你解决换钱的方法数-Java:时间复杂度为O(N*aim)的动态规划方法再结合空间压缩的技巧所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部