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

C++ 如何在这个算法难题中应用背包法?,c++,c,algorithm,C++,C,Algorithm,假设您有一个项目列表及其权重[]和价格[]。 现在给定两个整数N 如果dp[K]!=无穷大,这是您的解决方案,否则就没有解决方案。实际的效率取决于你如何计算最大重量:要么把所有物品的重量相加,要么试着更聪明一些。你想要的是一个动态规划(DP)解决方案,而不是一个背包问题。不过,背包有一个DP解决方案 你的病例的解决办法是形成必要的复发。由于您的目标是最大限度地减少金钱,每个状态转换将增加重量和项目编号,以形成一个新的状态 因此,您的状态空间是:DP[Weight][Item] 编码留作练习 dp

假设您有一个项目列表及其
权重[]
价格[]
。 现在给定两个整数
N

如果
dp[K]!=无穷大
,这是您的解决方案,否则就没有解决方案。实际的效率取决于你如何计算最大重量:要么把所有物品的重量相加,要么试着更聪明一些。

你想要的是一个动态规划(DP)解决方案,而不是一个背包问题。不过,背包有一个DP解决方案

你的病例的解决办法是形成必要的复发。由于您的目标是最大限度地减少金钱,每个状态转换将增加重量和项目编号,以形成一个新的状态

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

编码留作练习

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)