可以收集的最大苹果数量

时间:2017-02-07 19:37:41

标签: arrays algorithm

最初在他家的僧侣从一个农场顺序移动到另一个农场。总共有N个农场。

House-> 1st farm-> 2nd farm-> ... - >第N个农场

从一个农场跑到下一个农场消耗一个单位的和尚目前的能量。 最初,僧人在他的家里,搬到第一个农场时,他需要一个单位的能量。

您将获得阵列 milk [N] apples [N] 以及僧侣的初始能量 P (at屋)。

在每个农场,Monk都可以选择采取牛奶(通过牛奶[i] 的量来增加能量)或来自农场的苹果。允许僧侣只吃全部牛奶或全部量的苹果,而不是一个或两个。

通过这样,Monk可以收集的最大苹果数量是多少,总是具有非负能量?

示例:

N = 3   
P = 2  
milk = {1, 2, 1}  
apples = {100, 1, 100}

ans = 200

解决上述问题的任何方法或算法..

1 个答案:

答案 0 :(得分:0)

使用:

<!DOCTYPE html>
<html>

  <head>
    <link rel="stylesheet" href="style.css">
    <script src="script.js"></script>
  </head>

  <body>
    <audio id="audio" src="http://ricklemon.co.uk/game/sound.ogg" autostart="false" ></audio>
    <a onclick="PlaySound()"><img src="http://ricklemon.co.uk/game/images/speaker.png" width="200px" /></a>
    <script>
    function PlaySound() {
          var sound = document.getElementById("audio");
          sound.play()
      }
    </script>
  </body>

</html>

我们有了重复:

dp[i, j] = maximum amount of apples possible if we are at farm i
           with j energy

然后取dp[i, j] = max{dp[i-1, j+1] + apples[i] # Take the apples at i, only if j >= 0 dp[i - 1, j - energy[i]] # Take the energy at i 的最大值(如果使用零索引)。

对于您的示例,dp[N - 1, _]将是:

dp

您需要在dp[0, P-1] = dp[0, 1] = apples[0] = 100 dp[0, P-1+milk[0]] = dp[0, 2] = 0 dp[0, anything else] = -inf dp[1, 0] = max{dp[0, 0 + 1] + apples[1], dp[0, 0 - 2]} = 101 dp[1, 1] = max{dp[0, 1 + 1] + apples[1], dp[0, 1 - 2]} = max{0 + 1, -inf} = 1 dp[1, 2] = max{dp[0, 2 + 1] + apples[1], dp[0, 2 - 2]} = -inf dp[1, 3] = max{dp[0, 3 + 1] + apples[1], dp[0, 3 - 2]} = 100 dp[2, 0] = max{dp[1, 0 + 1] + apples[2], dp[1, 0 - 2]} = 101 dp[2, 1] = max{dp[1, 1 + 1] + apples[2], dp[1, 1 - 2]} = -inf dp[2, 2] = max{dp[1, 2 + 1] + apples[2], dp[1, 2 - 2]} = max{200, 101} = 200 次迭代中迭代j,直至i的总和。

在实现中可能有各种优化,例如只使用一个或两个数组而不是矩阵。