use*_*098 4 c algorithm dynamic-programming
我试图从SPOJ解决这个问题,这是一个动态编程问题,但是我在查看递归步骤时遇到了麻烦.我相信它类似于背包,但这里有两个氧气和氮气限制.
这应该工作我认为:
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循环必须从最大值向下变为当前柱面的值,否则您允许多次使用圆柱体.
问题的限制非常小,我认为这应该有效.