当前位置: 首页 > 面试题库 >

手写代码:有三种面值的硬币k1 < k2 < k3 ,找k面值的零钱,最少需要多少硬币

朱锐
2023-03-14
本文向大家介绍手写代码:有三种面值的硬币k1 < k2 < k3 ,找k面值的零钱,最少需要多少硬币相关面试题,主要包含被问及手写代码:有三种面值的硬币k1 < k2 < k3 ,找k面值的零钱,最少需要多少硬币时的应答技巧和注意事项,需要的朋友参考一下

参考回答:

假设有1 元,3 元,5 元的硬币,假设一个函数 d(i) 来表示需要凑出 i 的总价值需要的最少硬币数量。

当i = 0 时, d(0) = 0。不需要凑零钱,当然也不需要任何硬币了。

当i = 1 时,因为有 1 元的硬币,所以直接在第 1 步的基础上,加上 1 个 1 元硬币,得出 d(1) = 1。

当i = 2 时,因为并没有 2 元的硬币,所以只能拿 1 元的硬币来凑。在第 2 步的基础上,加上 1 个 1 元硬币,得出 d(2) = 2。

当i = 3 时,可以在第 3 步的基础上加上 1 个 1 元硬币,得到 3 这个结果。但其实有 3 元硬币,所以这一步的最优结果不是建立在第 3 步的结果上得来的,而是应该建立在第 1 步上,加上 1 个 3 元硬币,得到 d(3) = 1。

除了第1 步这个看似基本的公理外,其他往后的结果都是建立在它之前得到的某一步的最优解上,加上 1 个硬币得到。得出:

d(i) = d(j) + 1

这里j < i。通俗地讲,我们需要凑出 i 元,就在凑出 j 的结果上再加上某一个硬币就行了。

那这里我们加上的是哪个硬币呢。嗯,其实很简单,把每个硬币试一下就行了:

• 假设最后加上的是1 元硬币,那 d(i) = d(j) + 1 = d(i - 1) + 1。

• 假设最后加上的是3 元硬币,那 d(i) = d(j) + 1 = d(i - 3) + 1。

• 假设最后加上的是5 元硬币,那 d(i) = d(j) + 1 = d(i - 5) + 1。

我们分别计算出d(i - 1) + 1,d(i - 3) + 1,d(i - 5) + 1 的值,取其中的最小值,即为最优解,也就是 d(i)。

最后公式:

 

代码示例:

public class CoinProblemBasicTest {

private int[] d; // 储存结果

private int[] coins = {1, 3, 5}; // 硬币种类

private void d_func(int i, int num) {
if (i == 0) {
d[i] = 0;
d_func(i + 1, num);
}
else {
int min = 9999999;
for (int coin : coins) {
if (i >= coin && d[i - coin] + 1 < min) {
min = d[i - coin] + 1;
}
}
d[i] = min;
if (i < num) {
d_func(i + 1, num);
}
}
}
public void test() throws Exception {

int sum = 11; // 需要凑 11 元

d = new int[sum + 1]; // 初始化数组

d_func(0, sum); // 计算需要凑出 0 ~ sum 元需要的硬币数量

for (int i = 0; i <= sum; i++) {

System.out.println("凑齐 " + i + " 元需要 " + d[i] + " 个硬币");

}

}

}

 类似资料:
  • 我有这样的数据集: 长度:233333450560650780限制:5400 现在我的问题是,从设定的最高长度到最低长度中选择项目,以弥补限制或尽可能接近。 我知道背包和最小硬币兑换都能解决我的问题。我想知道哪个更好。 请注意,硬币变化是使用贪婪算法,背包使用动态编程

  • 本文向大家介绍手写代码:硬币找零问题(要求时间复杂度最佳)相关面试题,主要包含被问及手写代码:硬币找零问题(要求时间复杂度最佳)时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 给定一组硬币数,找出一组最少的硬币数,来找换零钱N。 如何减小时间复杂度:不用全局变量来保存计算过的值,也不用递归的方法来实现,用一个一维数组,再用循环来实现。 时间复杂度为O(c*n),c是coin的数量,n是am

  • 我试图用记忆和递归来解决硬币兑换的问题。但是我的代码中有一些小故障,它给了我错误的输出。 硬币面额1,2 我要一笔4英镑的总数。 可能的方法是 (1,1,1,1) (1,2,1) (2,2) 我期望输出3,但它返回5

  • 所以我对编码不熟悉,我得到了一个任务,我需要做一个程序,用四分之一、一角、五分和一美分给不到一美元的零钱。然而,作业希望程序打印所需的最低硬币数量(例如,如果我输入58美分,那么输出应该是“2个25美分,1个镍和3个便士”,而不是“2个25美分,0个10美分,1个镍和3个便士”。本质上,如果没有某种硬币,那么程序就不应该打印它)。我一直在想如何制作它,这样程序就不会打印任何不必要的硬币。 这就是我

  • 我试图找出如何解决一个问题,这似乎是一个常见算法问题的棘手变化,但需要额外的逻辑来处理特定的需求。 给定一个硬币列表和一个数量,我需要计算使用无限量可用硬币提取给定数量的可能方法的总数(这是一个典型的改变决策问题)https://en.wikipedia.org/wiki/Change-making_problem 使用动态规划(dynamic programming)轻松解决,同时满足一些附加要

  • 问题内容: 为此,我想将硬币兑换功能转换为记忆功能 ,因此我决定使用字典,以便字典中的键将是硬币,而值将是包含所有可更改“钥匙”的硬币的列表。硬币。 我所做的是: 我想得到一些建议,或者也许有另一种方法可以做到这一点。 谢谢。 编辑 备注版本: 问题答案: 当您可以只使用通用的预先编写的装饰器时,不必编写专门的记忆装饰器。例如,直接来自 PythonDecoratorLibrary 的以下 代码