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

标签 c++ c algorithm

假设您有一个项目列表及其 Weights[]Price[] 。 现在给定两个整数 N<=100K<=100 你必须找到你应该花费的最小金额使得你购买的元素的总重量恰好等于 K 并且元素数量不超过 N 并且如果不可能满足给定条件只打印 IMPOSSIBLE 。 您可以多次购买每件商品。

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

最佳答案

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 的方式:要么对所有项目权重求和,要么尝试更聪明。

关于c++ - 如何在这个算法难题中应用背包方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11685325/

相关文章:

c - 奇怪的 sscanf 行为

c - 如何用_mm_clflushopt函数编译程序?错误 : inlining failed

python - 抵消数据列表的算法

c++ - move 构造函数和赋值中的存储和加载指令数

c++ - 访问与内部类型同名的静态成员

c++ - 使用指针表示法反转 cstring 时出现意外结果

c++ - 这个C++程序有什么问题?

c - 用于频繁随机访问的数组或链表?

algorithm - 构成凸多边形的顶点数组的最大前缀

python - 索引错误 : list index out of range Why?