《程序员面试金典(第6版)》 面试题 08.11. 硬币(动态规划,组合问题,C++)

题目描述

硬币。给定数量不限的硬币,币值为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

解题思路与代码

这道题我拿到手上,就有了一种拿动态规划去解决它的冲动。所以让我们来看看这道题拿动态规划怎么去解决。

方法一 :动态规划

第一步,拿到这道题,先分析dp数组的下标以及含义是什么?

  • 定义一个一维数组dp,其中dp[i]表示组成金额n的钱的不同表示方法的数量。

第二步,去确定状态转移方程式什么?

  • 对于每一个币值(1,5,10,25),依次当前硬币的价值处开始遍历直到最大金额n处停止,一共有多少种方法,那么对于当前金额j,可以得出递推公式:
    • dp[j] = (dp[j] + dp[j - 当前币值]) % 1000000007

第三步,去初始化dp数组

  • 由于下一步的结果永远都是由上一步所去推出来的,所以我们要直到第一步的数值是多少,才好去做下面的推导
  • 我们要将初始化dp[0]为1,因为有一种表示方法是使用0个硬币组成0分。其余元素初始化为0。

第四步,确定如何遍历dp数组。

  • 我们要用一个双层的for循环去遍历这个dp数组,这是因为,我们一共有4种硬币的面值。所以我们要一次选择每一种面值的数额去作为其实遍历的点,直到达到题目要求的n时停止。
  • 那么代码大概就是这样:
	for(int& coin : coins)
            for(int i = coin; i < n+1; ++i)
                dp[i] = (dp[i] + dp[i - coin])%MOD;

第五步,举例推导dp数组

  • 这一步自己在纸上画一画就好了

具体的解决代码如下:

class Solution {
public:
    int waysToChange(int n) {
        int MOD = 1000000007;
        vector<int> dp(n+1);
        vector<int> coins{1,5,10,25};
        dp[0] = 1;
        for(int& coin : coins)
            for(int i = coin; i < n+1; ++i)
                dp[i] = (dp[i] + dp[i - coin])%MOD;
        return dp[n];
    }
};

在这里插入图片描述

复杂度分析

时间复杂度:O(n),其中n为输入金额。这是因为代码中有两层循环,第一层循环遍历硬币,它是一个常数4(币值:1, 5, 10, 25),第二层循环遍历所有金额,从硬币面值到n。因此,总时间复杂度是O(4n),可以简化为O(n)。

空间复杂度:O(n),其中n为输入金额。代码中主要的空间消耗来自dp数组,它的大小为n + 1。因此,空间复杂度为O(n)。

总结

这道题是动态规划里的一道组合类问题。我尝试着把这道题往0-1背包去靠,结果有点费劲。不如就像我这么去解释。

不要硬生生的划分给0-1背包,这就是一道动态规划的组合问题而已。

难度确实始终,也很好理解。但你要往0-1背包去靠,那就很难理解了。我个人感觉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Bentley MicroStation V8i (SelectSeries 4) 08.11.09.833是一款功能强大的CAD软件,主要用于工程设计和建筑设计方面,支持2D和3D建模、渲染和动画等多种功能。其具有自动化工具、可自定义的界面、强大的图形编辑和处理能力、多种文件格式的支持等特点,可以帮助用户在设计过程中提高效率和准确性。此软件灵活便捷,使用范围广泛,不仅适用于建筑、土木工程、交通运输、水利工程等行业,还可以用于电力、制造业等其他领域。Bentley MicroStation V8i (SelectSeries 4) 08.11.09.833拥有丰富的功能模块,例如MicroStation Descartes可以支持地理空间和影像处理,而MicroStation PowerDraft可以用于绘图和草图设计等。这款软件还可以集成其他Bentley产品,如InRoads、GEOPAK、MX等,以扩展其功能和灵活性。总的来说,Bentley MicroStation V8i (SelectSeries 4) 08.11.09.833是一款功能强大且灵活多样的CAD软件,能够帮助用户快速高效地完成设计任务,是各行业专业人士不可或缺的工具之一。 ### 回答2: Bentley MicroStation V8i (SELECTseries 4) 08.11.09.833是一款用于CAD和GIS设计的软件。该软件具有强大的三维建模和2D绘图工具,可以用于建筑、土木工程、机械工程、电气工程等领域的设计和制图。它的设计界面简单易用,功能强大,可以轻松创建复杂的设计模型和项目。除此之外,该软件还支持多种文件格式的导入和导出,可以方便地与其他CAD软件进行兼容。此外,该软件还拥有灵活的协作工具和强大的云端支持,可方便团队合作。总体来说,Bentley MicroStation V8i (SELECTseries 4) 08.11.09.833是一款优秀的CAD和GIS设计软件,对于需要进行复杂项目设计和制图的专业人士来说,是非常有价值的工具。 ### 回答3: Bentley MicroStation V8i (SELECTseries 4) 08.11.09.833是Bentley公司推出的一个建筑设计软件,可以用于建筑、土木工程和电气设计等领域。这个软件在功能方面非常强大,可以进行3D建模、制图和渲染等操作,并且还支持多种文件格式的导入和导出。 在使用过程中,该软件提供了丰富的工具和功能,可以帮助用户高效地完成各种任务。其中包括高级的CAD绘图和编辑功能、多样化的标注和尺寸控制、灵活的图层管理和复杂线型设置等。 除此之外,该软件还具有强大的工作流程管理功能,可以帮助用户更好地协作和组织项目。例如,它提供了定制化的自动化工具,可以快速生成标准的设计图件,并支持多用户同时协作同一项目。 总之,Bentley MicroStation V8i (SELECTseries 4) 08.11.09.833是一款功能强大、易于使用的建筑设计软件,为用户提供了综合性的设计解决方案,可以满足各种不同领域的设计需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿宋同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值