leetcode每日一题:硬币

本文探讨LeetCode中的硬币组合问题,通过动态规划方法解决如何使用不同面值的硬币凑成特定金额的问题。文章详细介绍了动态规划的思路,包括基本状态转移方程,并对时间和空间复杂度进行了优化分析。
摘要由CSDN通过智能技术生成

leetcode每日一题:硬币

题目描述

硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007)

示例1:

输入: n = 5
输出:2
解释: 有两种方式可以凑成总金额:
5=5
5=1+1+1+1+1
示例2:

输入: n = 10
输出:4
解释: 有四种方式可以凑成总金额:
10=10
10=5+5
10=5+1+1+1+1+1
10=1+1+1+1+1+1+1+1+1+1
说明:

注意:

你可以假设:

0 <= n (总金额) <= 1000000

以下解题思路来自leetcode官方题解:https://leetcode-cn.com/problems/coin-lcci/solution/ying-bi-by-leetcode-solution/

解题思路

动态规划

用一个函数 f ( i , v ) f(i,v) f(i,v)表示前 i i i种硬币总和为 v v v的方案数, c i c_i ci表示第 i i i种硬币的面值。例如用可用硬币有 { 1 , 5 , 10 , 25 } \{1, 5, 10, 25\} { 1,5,10,25},要凑成90分,那么此处 i = 4 i=4 i=4 v = 90 v=90 v=90 c 4 = 10 c_4 = 10 c4=10。函数 f ( i , v ) f(i,v) f(i,v)可以写成 f ( 4 , 90 ) f(4,90) f(4,90)

那么如果我们想凑成90分,可以考虑成这样一个问题,25分的硬币取0个,1个,2个或者3个(4个25分的就是100了)。然后再从25分的硬币可取的4种情况下分别讨论其他硬币的方案,有4种:
f ( 3 , 90 ) f ( 3 , 90 − 1 × 25 ) , f ( 3 , 90 − 2 × 25 ) , f ( 3 , 90 − 3 × 25 ) f(3,90)\quad f(3,90- 1×25),\quad f(3,90-2×25),\quad f(3,90-3×25) f(3,90)f(3,901×25),f(3,902×25),f(3,903×25)
那么
f ( 4 , 90 ) = f ( 3 , 90 ) + f ( 3 , 90 − 1 × 25 ) + f ( 3 , 90 − 2 × 25 ) + f ( 3 , 90 − 3 × 25 ) f(4,90) =f(3,90)+ f(3,90- 1×25)+ f(3,90-2×25)+f(3,90-3×25) f(4,90)=f(3,90)+f(3,901×25)+f(3,902×25)+f(3,903×25)
把上式抽象为一般情况,为
f ( i , v ) = ∑ j = 0 k f ( i − 1 , v − j × c i ) , k = ⌊ v c i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值