动态规划LeetCode322零钱兑换

题目描述:

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。

示例 1:

输入: coins = [1, 2, 5], amount = 11
输出: 3
解释: 11 = 5 + 5 + 1
示例 2:

输入: coins = [2], amount = 3
输出: -1
说明:
你可以认为每种硬币的数量是无限的。

思路:

利用贪心算法可以吗?

算法思路:

 1 class Solution {
 2     public int coinChange(int[] coins, int amount) {
 3
 4         int[] dp=new int[amount+1];
 5         for (int i=0; i<=amount; i++) {
 6             dp[i]=-1;
 7         }
 8         dp[0]=0;
 9         for (int i=1; i<=amount; i++) {
10             for (int j=0; j<coins.length; j++) {
11                 if (i-coins[j]>=0&&dp[i-coins[j]]!=-1) {
12                     if (dp[i]==-1||dp[i]>dp[i-coins[j]]+1) {
13                         dp[i]=dp[i-coins[j]]+1;
14                     }
15                 }
16             }
17
18         }
19         return dp[amount];
20     }
21 }

这属于一类背包问题,程序还是需要好好思考的!!

欢迎评论,共同进步!!

原文地址:https://www.cnblogs.com/hengzhezou/p/11042906.html

时间: 2024-10-31 21:48:55

动态规划LeetCode322零钱兑换的相关文章

[Swift]LeetCode322. 零钱兑换 | Coin Change

You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins,

LeetCode:零钱兑换【322】【DP】

LeetCode:零钱兑换[322][DP] 题目描述 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输入: coins = [1, 2, 5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1 示例 2: 输入: coins = [2], amount = 3 输出: -1 说明:你可以认为每种硬币的数量是无限的. 题目分析 很显然,这是

零钱兑换

题目 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输入: coins = [1, 2, 5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1 示例 2: 输入: coins = [2], amount = 3 输出: -1 说明: 你可以认为每种硬币的数量是无限的. 代码 思路:动态规划 假设conis={c1,c2,...},那么f(

leetcode 322 零钱兑换

目录 1. 题目 2. 解法 2.1. 暴力穷举 2.2. 动态规划-1 自下而上 2.3. 动态规划-2 自上而下 3. 代码及测试结果 3.1. 测试代码: 3.2. 结果: 1. 题目 零钱兑换 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输入: coins = [1, 2, 5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1

SICP 习题 (2.19) 解题总结:重写零钱兑换程序

SICP 习题2.19 要求我们重新设计1.2.2节的零钱兑换程序,要求我们可以轻易改变程序里用的兑换币种. 我们先看看1.2.2节的零钱兑换程序,代码是这样的: (define (RMB-Change amount) (format #t "Changing ~S~%" amount) (cond ((= amount 0) 0) ((< amount 0) 0) (else (RMB-Change-Recursive amount 1 '() )))) (define (RM

322.零钱兑换(动态规划)

给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/coin-change著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出处. 以前我会直接贪婪算法,然后解不出来,现在第一想法就是动态规划:把每一步的最优解都算出来,取最后一项返回. 本题状态转移方程: dp[ i ]

动态规划--换零钱

题目描述 想兑换100元钱,有1,2,5,10四种钱,问总共有多少兑换方法 递归解法 #include<iostream> using namespace std; const int N = 100; int dimes[] = {1, 2, 5, 10}; int arr[N+1] = {1}; int coinExchangeRecursion(int n, int m) //递归方式实现,更好理解 { if (n == 0) //跳出递归的条件 return 1; if (n <

leetcode 322零钱兑换

You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins,

翻译:动态规划--找零钱 coin change

来自http://www.geeksforgeeks.org/dynamic-programming-set-7-coin-change/ 对于整数N,找出N的所有零钱的表示.零钱可以用S={s1,s2,s3,..sm}表示,每种零钱的数量为无穷.请问有多少种找零的方法? 例如, N = 4,S = {1,2,3},有四种找零方式{1,1,1,1},{1,1,2},{2,2},{1,3},return 4 N = 10,S= {2,5,3,6} ,有5中找零方式{2,2,2,2,2}, {2,2