考虑2*k个元组(a0, b0),(a1, b1)…和2个容器A和B,将第i个元组放入容器A将花费ai美元,放入容器B将花费bi美元。将k个元素放入容器A和k个元素放入容器B的最小成本是多少。
我想到了贪心算法:按降序排序元组数组,以abs(ai-bi)作为键。然而,我们能否通过使用动态规划来解决此问题?如果不是两个而是n个容器,该怎么办?
我想到了贪心算法:按降序排序元组数组,以abs(ai-bi)作为键。然而,我们能否通过使用动态规划来解决此问题?如果不是两个而是n个容器,该怎么办?
让 dp[i][j]
表示前 i 个元素放入 A 中放置 j 个元素的最小成本,例如,dp[0][0]
是前 0 个元素放入 A 中放置 0 个元素的最小成本;dp[4][2]
是前 4 个元素放入 A 中放置 2 个元素的最小成本。
然后:对于第 i
个元素(索引为 i - 1
,因此使用 b[i - 1]
和 a[i - 1]
),我们需要将其放入 A 或 B 中。因此,我们计算两种情况的最小值:
dp 函数:dp[i][j] = Math.min(dp[i - 1][j] + b[i - 1], dp[i][j - 1] + a[i - 1])
然后问题就是获取 dp[2*k][k]
。
O(k^2)
。将其自然推广到n
个桶将会是O(k^n)
。对于n=2
,贪心算法更好。 - btilly