我正在构建一种自下而上的方法来解决硬币兑换问题。我必须提供所需的最低硬币数量,以提供所需的零钱。可能由于给定的面额无法形成值,因此无法给出更改。
例如,如果给定的面额是{4,8},他们要求改变5,那么就不可能给5。我构建了下面的程序,它适用于大多数情况,除非不可能形成所请求的更改。例如,当面值仅为{4}而我请求5时,它返回一个假值。我能做些什么来纠正这个问题?
这里P表示请求的更改,S是存储在数组中的面值[]的数目,从索引0到S-1。dp是一个二维数组,用于初始化为-1的计算。
for (int i = 0; i <= P; ++i) {
for (int j = 0; j < S; ++j) {
int ans, x, y;
// Min. no. of coins with current coin
x = (i - denominations[j] >= 0) ? dp[i - denominations[j]][j] + 1: 0;
// Min. no. of coins w/o current coin
y = (j > 0) ? dp[i][j - 1] : 0;
ans = min(x, y);
if (ans == 0) ans = max(x, y);
dp[i][j] = ans;
}
}
谢谢你的帮助。
错误在于,当禁止使用和不使用当前硬币时,您没有正确处理该情况。这发生在你的例子中,例如:当i=1和j=0时,我们试图不使用任何东西或仅使用一枚4c硬币来获得1c的总数;但是我们不能用4c币来做这件事,没有4c币也不行。
在这种情况下,x和y都将被指定为0,如果(ans==0)ans=max(x,y),则行
,旨在捕捉禁止任何一种可能性时的情况,最终错误地将0分配给ans。随后的外循环迭代将“认为”有可能使相应的总和不包含任何硬币,并愉快地在此基础上加上1,为您的示例给出不正确的答案1。
我认为,最干净的修复方法是选择一个不同于0的sentinel值来表示“此操作是不可能的,不应考虑”。由于将这两种可能的操作与
min()
组合在一起,因此一个非常高的值自然适合:
#define INF (INT_MAX-1) // Or anything higher than the biggest sensible answer
for (int i = 0; i <= P; ++i) {
for (int j = 0; j < S; ++j) {
int ans, x, y;
// Min. no. of coins with current coin
x = (i - denominations[j] >= 0) ? min(INF, dp[i - denominations[j]][j] + 1) : INF;
// Min. no. of coins w/o current coin
y = (j > 0) ? dp[i][j - 1] : INF;
ans = min(x, y);
dp[i][j] = ans;
}
}
请注意
ans=min(x, y);
行现在给出了正确的答案,而无需进一步的工作,包括它应该是INF
的情况,因为x和y都是INF
。
更微妙的一点是,当我们在计算过程中读取一些
dp[A][b]
时,该值被允许为INF
:这是一个合法值,表明A
美分不能与任何类型的硬币组合
我正在研究Leetcode322:硬币兑换。 您将获得一个整数数组,表示不同面额的硬币,以及一个整数金额,表示总金额。 返回您需要的最少数量的硬币,以弥补该金额。如果这些硬币的任何组合都无法弥补这一数额,则返回-1。 你可以假设每种硬币的数量是无限的。 例子: 输入:硬币=[1,2,5],金额=11 输出: 3 说明:11 = 5 5 1 我选择自上而下的方法,在每次迭代中,我选择一个面额不大于剩
这是Leetcode的硬币兑换问题,在这里,给定面额的硬币是无限的,你必须找到满足给定金额所需的最小硬币。我尝试使用自顶向下的1D缓存阵列解决这个问题。基本测试用例通过了,但对于一些较大的总和和面额值,它失败了。我的假设是,我在遍历数组时做错了什么,可能遗漏了一些子问题的计算,但无法找到解决问题的方法。 问题陈述: 我的解决方案:
所以我对编码不熟悉,我得到了一个任务,我需要做一个程序,用四分之一、一角、五分和一美分给不到一美元的零钱。然而,作业希望程序打印所需的最低硬币数量(例如,如果我输入58美分,那么输出应该是“2个25美分,1个镍和3个便士”,而不是“2个25美分,0个10美分,1个镍和3个便士”。本质上,如果没有某种硬币,那么程序就不应该打印它)。我一直在想如何制作它,这样程序就不会打印任何不必要的硬币。 这就是我
我现在正在研究leetcode322。换硬币,问题如下: 您将获得一个整数数组,表示不同面额的硬币,以及一个整数金额,表示总金额。 返回您需要的最少数量的硬币,以弥补该金额。如果这些硬币的任何组合都无法弥补这一数额,则返回-1。 你可以假设每种硬币的数量是无限的。 例1: 输入:硬币=[1,2,5],数量=11输出:3说明:11=5 1 例2: 输入:硬币=[2],金额=3输出:-1 例3: 输入
我们让一个实习生用自上而下的方法解决最小硬币问题。问题陈述给出了一组硬币,返回构成总和所需的最小硬币。此外,还应返还构成金额的硬币。 这是密码 代码在大部分情况下看起来不错。但不会返回预期的结果。当使用上述输入执行时,程序返回INT.MAX作为minCoins,列表为空。 有关于代码哪里出错的提示吗?谢谢
具体而言,问题是: 给定面额数组<代码>硬币[],每个硬币的限制数组<代码>限制[]和数量<代码>金额,返回所需的最小硬币数量,以获取<代码>金额,或者如果不可能,返回空值。另外,用溶液中使用的每个硬币的数量填充数组 这是我的解决方案: 但它一般不起作用。 我的问题是,例如,在这种情况下: 最佳解决方案是: 并且我的算法给出作为结果。换句话说,它失败了,每当在某种情况下,我将不得不使用比可能的更少