簡體   English   中英

查找最大數量的硬幣和選定的硬幣

[英]Find Maximum amount of Coins and Selected Coins

我正在做硬幣排問題。 我遇到了一個小問題。

有一排 n 個硬幣,其值為一些正整數c1, c2, . . . , cn c1, c2, . . . , cn 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];
}

我怎樣才能用我的代碼獲得選定的硬幣?

一個好的解決方案將涉及遞歸、回溯和記憶(動態編程)。 編寫一個遞歸例程,從左端嘗試每個可用的選擇,然后在剩余的列表上遞歸。 您當前的算法在其可見范圍內有一個不平衡值的盲點(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)

這就是總攻。 您可以加快解決了很多與記憶化。 此外,您需要將其轉換為您首選的實現語言為此添加跟蹤,以便您獲得所需的索引。 如果您只需要按順序返回硬幣值,那么累積這些值的數組很簡單,每次返回時都預先准備一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM