假设您有一个项目列表及其Weights[]
和Price[]
。
现在给出两个整数N<=100
和K<=100
,你必须找到你应该花费的最小金额,使你购买的物品的总重量完全等于K,物品的数量不超过N.如果无法满足给定条件,则只需打印IMPOSSIBLE
。
您可以多次购买每件商品。
请告诉我如何在这个问题上应用背包,如果它不是背包问题那么如何解决呢?
答案 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]
编码留作练习。