查找最大数量的硬币和选定的硬币

Posted

技术标签:

【中文标题】查找最大数量的硬币和选定的硬币【英文标题】:Find Maximum amount of Coins and Selected Coins 【发布时间】:2018-12-04 19:51:56 【问题描述】:

我正在做硬币排问题。我遇到了一个小问题。

有一排 n 个硬币,其值为一些正整数c1, c2, . . . , cn,不一定不同。

目标是在你不能捡起任何两个相邻硬币的限制下捡起最大数量的钱。例如,在下面的例子中,一旦你拿起10,你就不能选择6或左边的2

例子:

enter the number of coins: 6
enter the value of all coins : 5 1 2 10 6 2 
The maximum amount of coin : 17
The selected coins to get maximum value : C1 , C4 , C6

我想获得选定的硬币(前 C1、C4、C6)。

这是我的功能代码 我只能在这段代码中获得最大数量。

int getanswer(int array[],int len)

  int C[20];
  for (int j = 0; j < len; j++)
  
        C[j + 1] = array[j];
  

  int F[20];
  F[0] = 0;
  F[1] = C[1];

  for (int j = 2; j < len+1; j++)
  
      F[j] = max(C[j] + F[j - 2], F[j - 1]);
      printf("temp :%d\n", C[j]);
  

  return F[len];

如何使用我的代码获得选定的硬币?

【问题讨论】:

在“我应该如何编码”之前,您应该问(自己)“算法是什么?”。 @EugeneSh。 “算法是什么,我应该如何编码?”怎么样? (不过,我很确定这个问题可以进一步改进) @Swordfish 那是我会在没有评论的情况下进行 VTC 的事情 :) 您的问题是什么?建议如何以任何方式做到这一点,即低效的蛮力可以吗?或者您是否已经有了蛮力解决方案并要求优化?在后一种情况下,请显示您拥有的代码。 在“我应该如何编码”之前问问自己“我应该选择哪种语言”并选择 C ​​或 C++。它们是不同的语言。例如,C++ 的 std::vector 用于运行时,std::string 用于文本。 C 语言没有。 【参考方案1】:

一个好的解决方案包括递归、回溯和记忆(动态编程)。编写一个递归例程,尝试从左端开始的每个可用选项,然后在剩余的列表上递归。您当前的算法在其可见范围内(2 个元素外)对不平衡值有一个盲点。

这里有一些伪代码可以帮助您开始。

int pickup(coin[])

    // base case: <= 2 coins left
    if size(coin) == 0           // return 0 for an empty list
        return 0
    if size(coin) <= 2           // if only 1 or 2 coins left, return the larger
        return max(coin)

    // Otherwise, experiment:
    //   pick *each* of the first two coins, solve the remaining problem,
    //   and compare results.
    pick1 = coin[0] + pickup(coin[2:])      // pick 1st coin; recur on rest of list
    pick2 = coin[1] + pickup(coin[3:])      // pick 2nd coin; recur on rest of list

    return max(pick1, pick2)

这是一般攻击。您可以通过记忆化加速解决方案很多。此外,您需要将其转换为您的首选实现语言添加跟踪,以便获得所需的索引。如果您只需要按顺序返回硬币值,则可以简单地累积这些值的数组,并在每次返回时添加一个。

【讨论】:

感谢您的友好回答 :) 但是如何在您的算法中获得“选定的硬币(如 C1、C4、C6)”?? 正如我所说,您需要在每次递归调用返回时累积这些值。 非常感谢。好兄弟:)

以上是关于查找最大数量的硬币和选定的硬币的主要内容,如果未能解决你的问题,请参考以下文章

硬币收集2人游戏

LeetCode1561. 你可以获得的最大硬币数目(C++)

LeetCode1561. 你可以获得的最大硬币数目(C++)

查找所有排列以获得给定的总和(硬币找零问题)

掷硬币计数游戏C++数据结构!

动态规划-1620. 收集硬币