硬币行算法

时间:2013-04-22 06:14:18

标签: c++ algorithm dynamic-programming

我坚持这个算法问题而且我得到了这个概念,但我很难想象它的实现。硬币行问题有一排n个硬币,其值是一些正整数c1,c2,.... 。 。 ,cn,不一定是明显的。目标是获得最大金额,但要受到限制,即不能拾取初始行中相邻的两个硬币。我这里有一个基本的算法。

F[0]←0; F[1]←C[1]
for i ← 2 to n do
    F [i] ← max(C[i] + F [i − 2], F [i − 1]) 
return F [n]

有人可以在设置基本实现时启动我。谢谢。

2 个答案:

答案 0 :(得分:0)

根据您的算法,你需要这样的东西:

int coin_row(int[] array, int index, int length)
{
    if (index >= length) //beyond last coin
    {
        return 0;
    }

    int value = array[index];
    if (index >= length - 1) //last coin
    {
        return value;
    }
    else if (index >= length - 2) //second last coin
    {
        return max(value, coin+row(array, index+1);
    }

    return max(value+coin_row(array, index+2), coin_row(array, index+1));
}

打电话
coin_row(array, 0, length of array);

答案 1 :(得分:0)

int max(int a, int b) {
  if(a > b) return a;
  return b;
}

int coin_row(int[] C, int n) {
  int F[n+1], i;
  F[0] = 0; F[1] = C[1];

  for(i = 2;i<=n;i++) {
    F[i] = max(C[i] + F[i-2], F[i-1]);
  }

  return F[n];
}