leetcode 面试题 08.11. 硬币 「动态规划」

博客探讨了LeetCode面试题中关于硬币组合的问题,通过动态规划方法解决完全背包问题。文章指出了在初始设定dp数组时的一个常见误解,并分析了错误答案中因硬币顺序导致的重复计数问题。最后,提出了改进后的正确解决方案,确保在考虑硬币组合时避免重复计算。
摘要由CSDN通过智能技术生成

leetcode 面试题 08.11. 硬币

在这里插入图片描述

动态规划解法:完全背包问题

完全背包问题即不限定硬币的个数地去组合硬币达到指定的值。

这道题为求组合成指定数额有几种情况,我们设置dp数组:
dp[k] 为组成k面额的硬币情况数。

int[] dp = new int[n + 1];

设置基本情况:

dp[0] = 1;

这里的dp[0]的含义不是应该是0吗?(组成0的硬币种类数为0)
这里的dp[0]的作用并不作为组成0的硬币情况数,而是一个作为完美能被一个硬币表示的情况为1。即:

while k - coin == 0 :
	dp[k] += dp[k - coin];
	=>
	dp[k] += dp[0];

我们可以简单地得出对应的dp方程:

for(int coin: coins) {
   
	dp[k] += dp[k - coin];
}
由于题意中要求对 1000000007求余。
则:
for(int coin: coins) {
   
	dp[k] = (dp[k] + dp[k - coin]) % 1000000007;
}
错误答案:

接下来好像已经得出了答案,可以轻松写出代码了,但是这个答案是错的

class Solution {
   
    public int waysToChange
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值