动态编程SPOJ问题SCUBADIV

use*_*098 4 c algorithm dynamic-programming

我试图从SPOJ解决这个问题,这是一个动态编程问题,但是我在查看递归步骤时遇到了麻烦.我相信它类似于背包,但这里有两个氧气和氮气限制.

这是链接:http://www.spoj.pl/problems/SCUBADIV/

IVl*_*lad 5

这应该工作我认为:

dp[i, j] = minimum weight needed such that we have i litres of oxygen and j litres 
           of nitrogen

dp[0, 0] = 0 and inf everywhere else
for each read cylinder k do
  for i = maxTotalOxygen down to oxygen[k] do
    for j = maxTotalNitrogen down to nitrogen[k]  do
      dp[i, j] = min(dp[i, j],                                       <- do not take cylinder k
                     dp[i - oxygen[k], j - nitrogen[k]] + weight[k])  <- take cylinder k 

Answer is the minimum dp[i, j] such that i >= RequiredOxygen and j >= RequiredNitrogen.
Run Code Online (Sandbox Code Playgroud)

请注意,for循环必须从最大值向下变为当前柱面的值,否则您允许多次使用圆柱体.

问题的限制非常小,我认为这应该有效.