首页 > 其他分享 >动态规划-零钱兑换

动态规划-零钱兑换

时间:2022-11-01 17:01:05浏览次数:43  
标签:硬币 int nums 个数 零钱 amount 兑换 动态 dp

零钱兑换也是动态规划的典型问题,一般是给你几种零钱,数量不限,给一个amount,问共有多少种兑零钱的方法。

我们看一个案例

案例1:

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

你可以认为每种硬币的数量是无限的。

我们首先定义一个dp数组,dp[i]表示兑换i块钱所需的最少硬币个数。

加入coins={1,2,5}

那么dp[i]就可以拆分为三个小问题

①dp[i-1]+1

②dp[i-2]+1

③dp[i-5]+1

因为要求的是最少硬币个数,所有我们对三种方案求最小值即可。

class Solution {
        public int coinChange(int[] coins, int amount) {
        int max = amount + 1;
        int[] dp = new int[amount + 1];
        //根据题意,可能有兑换不成功的情况,所以我们定义dp[i]的最大值为amount+1
        Arrays.fill(dp, max);
        dp[0] = 0;
        for (int i = 1; i <= amount; i++) {
            for (int j = 0; j < coins.length; j++) {
               //只有当前钱数i大于硬币面值时才可以兑换
                int coin=coins[j];
                if (coin <= i) {
                    dp[i] = Math.min(dp[i], dp[i - coin] + 1);
                }
            }
        }
        return dp[amount] > amount ? -1 : dp[amount];
        }
}

 

案例2:给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。

题目数据保证答案符合 32 位整数范围。

这个题目和案例1极为相似,差别在于案例1求的是最小硬币个数,本题目求的是组合个数

public int combinationSum4(int[] nums, int target) {
        int[] dp = new int[target + 1];
        dp[0] = 1;
        //对应任意x,dp[x],如果有nums[i]小于x,那么dp[x]=sum{dp[x-nums[i]]}
        for (int i = 1; i <= target; i++) {
            for (int num : nums) {
                if (num <= i) {
                    dp[i] += dp[i - num];
                }
            }
        }
        return dp[target];

 

标签:硬币,int,nums,个数,零钱,amount,兑换,动态,dp
From: https://www.cnblogs.com/wangbin2188/p/16848332.html

相关文章

  • Eolink 10月企业与产品动态速览
    本月,值得关注的产品好消息莫过于Eolink私有云10.5.4版本发布,以及开源项目Eoapiv1.8.0版本发布。Eolink深耕于API领域并持续探索前行,作为标准撰写单位之一参与......
  • 动态规划学习入门(小白零基础)
    动态规划学习入门(小白零基础)基础概念如果某一问题可拆解成若干重叠子问题,即可用动态规划解决。重叠子问题:比如斐波那契数列F(n)可分解成F(n-1)+F(n-2),而F(n-1)又可......
  • 学习笔记——动态 dp
    前言好消息,CSP-St4出DDP,并且有的人场上为了调T3的假算没写。。。概述其实是个挺简单的东西,就是如果一道题可以通过dp轻松解决,但是题目加上了每次询问修改一些信......
  • 动态规划-回文串
    回文串是从左到右和从右到左读起来一样的字符串,变种还有回文子序列,区别就是字符可以不连续。求回文串个数、最长回文串、最长回文序列也是典型的二维动态规划问题。我们......
  • 动态规划-公共子序列
    公共子序列是二维动态规划的典型问题,一般用了求两个字符串的相似程度。我们看一个案例:案例1:给定两个字符串 text1和 text2,返回这两个字符串的最长公共子序列的长度......
  • 动态规划-子序列
    子序列是序列的一部分,元素可以不连续。子串是字符串的一部分,必须连续。求子序列的和、连续递增子序列都是经典的一维动态规划问题。这一类题目都有差不多的思路,我们看案......
  • 【QT】创建动态链接库及使用
    创建动态链接库创建一个项目选择library的C++库,下一步。选择共享库,输入动态库的名字,选择创建路径,下一步选择编译环境,下一步选择QTCore模块,该模块提供核心的非图......
  • node2_动态路径拼接错误问题
      如果使用相对路径,不在当前目录下通过其他目录来找到这个JS运行就会报错,当我们使用fs模块来操作文件时,我们如果使用相对路径的话,很容易出现路劲动态拼接错误的情况,......
  • vue动态绑定class的几种方式
    开发项目中:vue动态绑定class的几种方式~第一种:(最简单的绑定)1.绑定单个classhtml部分: <div:class="{'active':isActive}"></div>js部分:判断是否绑定一个activedat......
  • 动态规划-路径问题
    动态规划是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法,常常适用于有重叠子问题和最优子结构性质的问题,并且记录所有子问题的结果,因此动态规划方法所......