当前位置: 首页 > 编程笔记 >

找出可以在Python中收集的最大硬币数量的问题

杨成礼
2023-03-14
本文向大家介绍找出可以在Python中收集的最大硬币数量的问题,包括了找出可以在Python中收集的最大硬币数量的问题的使用技巧和注意事项,需要的朋友参考一下

假设我们有一个二维矩阵,其中的单元代表其中的硬币数量。我们有两个朋友来收集硬币,它们分别位于开始时的左上角和右上角。他们遵循以下规则:

  • 硬币收集器可以从单元格(i,j)移至单元格(i + 1,j-1),(i + 1,j)或(i + 1,j + 1)。

  • 到达牢房后,他们会收集所有可用硬币,使牢房变空。

  • 收藏家可以选择留在一个牢房,但是任何一个牢房中的硬币只能收集一次。

我们必须找到可以收集的最大硬币数量。

所以,如果输入像

0 4 1 0
3 1 4 0
2 5 1 1
3 0 0 0

那么输出将为17。

为了解决这个问题,我们将遵循以下步骤-

  • A:=输入矩阵

  • R:= A的行数

  • C:= A的列数

  • 定义一个功能dp()。这将需要r,c1,c2

    • 对于[c2 − 1,c2,c2 + 1]中的每个nc2,执行

    • ans:= ans和(base + dp(r + 1,nc1,nc2))的最大值

    • 如果0 <= nc1 <C和0 <= nc2 <C,则

    • 返回0

    • 如果r与R相同,则

    • ans:= A [r,c1] +(如果c1不等于c2,则1否则为0)* A [r,c2]

    • 基本:= ans

    • 对于[c1 − 1,c1,c1 + 1]中的每个nc1,执行

    • 返回ans

    • 返回dp(0,0,C − 1)

    让我们看下面的实现以更好地理解-

    示例

    class Solution:
       def solve(self, A):
          R, C = len(A), len(A[0])
          def dp(r, c1, c2):
             if r == R:
                return 0
             ans = base = A[r][c1] + (c1 != c2) * A[r][c2]
             for nc1 in [c1 − 1, c1, c1 + 1]:
                for nc2 in [c2 − 1, c2, c2 + 1]:
                   if 0 <= nc1 < C and 0 <= nc2 < C:
                      ans = max(ans, base + dp(r + 1, nc1, nc2))
             return ans
          return dp(0, 0, C − 1)
    ob = Solution()
    print(ob.solve([
       [0, 4, 1, 0],
       [3, 1, 4, 0],
       [2, 5, 1, 1],
       [3, 0, 0, 0]
    ]))

    输入值

    [
       [0, 4, 1, 0],
       [3, 1, 4, 0],
       [2, 5, 1, 1],
       [3, 0, 0, 0]
    ]
    输出结果
    17

     类似资料:
    • 具体而言,问题是: 给定面额数组<代码>硬币[],每个硬币的限制数组<代码>限制[]和数量<代码>金额,返回所需的最小硬币数量,以获取<代码>金额,或者如果不可能,返回空值。另外,用溶液中使用的每个硬币的数量填充数组 这是我的解决方案: 但它一般不起作用。 我的问题是,例如,在这种情况下: 最佳解决方案是: 并且我的算法给出作为结果。换句话说,它失败了,每当在某种情况下,我将不得不使用比可能的更少

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

    • 我正在解决这个问题-COLCOIN-在spoj上收集硬币。链接-https://www.spoj.com/problems/COLCOIN/ 对于给定的一组面额和你想要的货币,银行会给你最高面额的硬币,直到它不能再给你了,然后转移到下一个最高面额。例如:如果面额为[1,2,3,4,8],如果您要求23卢比,它会先给您两个8卢比的硬币,因为它不能再给任何8卢比的硬币,所以会移动到下一个面额,给您一个

    • 只是在这里遇到了这个简单的算法,从相同的称重硬币列表中找到奇数硬币(重达重)。 我可以理解,如果我们一次拿3个硬币,那么最小称重次数只有两个。 我是怎么找到答案的? 我人工试了一下一次称4套硬币,一次称3套硬币,一次称两个硬币,一次称一个硬币。 当然,只有当我们一次拿3个硬币时,最少的步数(两步)才是可以达到的。 问题是,你怎么知道我们必须拿3个硬币? 我只是想知道如何解决这个难题,而不是做所有可

    • 我正在尝试打印最小数量的硬币来进行更改,如果不可能,请打印-1 在这段代码中,变量int[]c(硬币数组)有面额,我可以用它来计算总金额。 INT总有总和,我需要拿出使用硬币(无限供应) 对于Sum:4759和Array:{3190836},正确的输出是:59,我的输出是:60 代码中有什么错误? 下面是我的递归解决方案,尝试在DP解决方案中应用相同的逻辑。这里的逻辑似乎也有问题。对于相同的输入,

    • 这个问题和这里问的一样。 给定一个硬币列表,它们的值(c1,c2,c3,... cj,...),以及总和i。找出硬币总数为i的最小数量(我们可以根据需要使用一种类型的硬币),或者报告不可能以总和为S的方式选择硬币。 我昨天刚刚被介绍到动态编程,我试图为它编写一个代码。 这里,C[i]是货币量“i”的最优解。可用的硬币有{c1,c2,…,cj,…}对于这个程序,我增加了递归限制,以避免最大递归深度超