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)