如何在这个算法难题中应用背包方法?

时间:2012-07-27 09:47:11

标签: c++ c algorithm

假设您有一个项目列表及其Weights[]Price[]。 现在给出两个整数N<=100K<=100,你必须找到你应该花费的最小金额,使你购买的物品的总重量完全等于K,物品的数量不超过N.如果无法满足给定条件,则只需打印IMPOSSIBLE。 您可以多次购买每件商品。

请告诉我如何在这个问题上应用背包,如果它不是背包问题那么如何解决呢?

2 个答案:

答案 0 :(得分:1)

dp[i] = minimum money you have to pay to get weight i

dp[_] = infinity

for i = 1 to N do
  for j = item[i].weight to MaxWeight do
    dp[j] = min(dp[j], dp[j - item[i].weight] + item[i].price)

如果dp[K] != infinity,这是您的解决方案,否则就没有解决方案。实际效率取决于你如何计算MaxWeight:要么总和所有项目权重,要么尝试更聪明。

答案 1 :(得分:1)

您需要动态编程(DP)解决方案,而不是完全是背包问题。虽然,Knapsack有一个DP解决方案。

您的案例的解决方案是形成必要的复发。由于您的目标是最小化资金,因此每个州的过渡都将添加到权重和项目编号以形成新的状态。

因此,您的状态空间为:DP[Weight][Item]

编码留作练习。