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

时间:2018-12-04 19:51:56

标签: c++ c algorithm

我在做硬币行问题。而且我有一个小问题。

有一排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

我想获得精选硬币(例如ex中的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];
}

如何使用我的代码获取所选硬币?

1 个答案:

答案 0 :(得分:0)

一个好的解决方案将涉及递归,回溯和记忆化(动态编程)。编写一个递归例程,从左端尝试每个可用选项,然后递归到其余列表。您当前的算法在可见范围内(不包括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)

那是一般的攻击。您可以通过备注以 lot 加快解决方案。另外,您需要将其转换为首选的实现语言 并为此添加跟踪,以便获得所需的索引。如果您只需要按顺序返回硬币值,则可以很容易地累积这些值的数组,并在每次返回前添加一个。