当前位置: 首页 > 知识库问答 >
问题:

01背包专门化

郑宇
2023-03-14

经典背包。

这里有一个转折:在这些物品中,我需要确保我有从不同类别中提取的特定数量(不是最高的,而是确切的数量)。

所以让我们假设我们有类别

    null

共有1个答案

蓟清野
2023-03-14

一种可能的ILP/LP配方(最明显的一种,但从来没有一种配方)可能是:(未经测试)

maximize sum(v[i] * x[i])
subject to:
0 <= x[i] <= 1        // can take every item at most once
sum(w[i] * x[i]) <= W // don't go over the weight limit
F <= sum(f[i] * x[i]) <= F + 1 // take F or F+1 food items
T <= sum(t[i] * x[i]) <= T + 1 // take T or T+1 toys
C <= sum(c[i] * x[i]) <= C + 1 // take C or C+1 clothes
sum(x[i]) == F + T + C + M     // take exactly the right number of items

其中v[i]是值,w[i]是权重,f[i]是项目的“食物度”,t[i]是“丰满度”,现在您已经知道c[i]将是什么了。属于一个以上类别的物品会被计算为双倍或三倍(例如,如果你拿了一个可食用的玩具,它会被计算在玩具和食物中),这可以通过放入该物品的多个副本来避免,每个类别一个副本,每个副本只在一个类别中。

但现在真正的问题,如何才能解决呢?这仍然是一个积极研究的领域,但这里有一个想法在这种情况下应该很有效。

 类似资料:
  • 主要内容:动态规划解决01背包问题,01背包问题的具体实现商店的货架上摆放着不同重量和价值的商品,一个小偷在商店行窃,他携带的背包只能装固定重量的商品。装哪些商品才能获得最大的收益呢?在限定条件内找到最佳的物品组合,这样的问题统称为背包问题。 根据限定的条件不同,背包问题还可以细分: 部分背包问题:所有物品是可再分的,即允许将某件物品的一部分(例如 1/3)放入背包; 0-1 背包问题:所有物品不可再分,要么整个装入背包,要么放弃,不允许出现“仅选择物品

  • 本文向大家介绍手写代码:01背包相关面试题,主要包含被问及手写代码:01背包时的应答技巧和注意事项,需要的朋友参考一下 参考回答:  

  • 问题 你面前摆放着 n 个珠宝(共 n 种,每种 1 个),已知珠宝 s_i 的价值是 v_i ,重量是 w_i 。给你一个背包,你可以自由挑选珠宝装到背包中,但背包可以装载的最大重量为 t 。求背包能够装载珠宝的最大价值 v 。 解法 设 f(i,j) 为背包中放入前 i 件物品,重量不大于 j 的最大价值,其中 i in [1,n] , j in [0,t] 。有如下状态转移方程: f(i,j

  • 动态规划 动态规划 Dynamic Programming,核心思想就是将大问题划分成小问题进行解决,从而一步一步的获得最优解的处理算法 动态规划跟分治算法思想类似,但动态规划算法会依赖到上一次计算的结果,每次求解是建立在上一次子阶段的结果基础之上进一步处理,而分治算法分解出来问题往往是独立的 动态规划一般可以通过填表的方式进行逐步推进得到最优解 0/1背包问题 01背包问题是经典的利用动态规划算

  • 问题 在<Zero One Knapsack>的基础上,不仅求出最大价值,还求出具体选择了哪些珠宝,即求出具体的选择方案。 解法 仍然按照<Zero One Knapsack>中的方法,设 f(i,j) 为背包中放入前 i 件物品,重量不大于 j 的最大价值,其中 i in [1,n] , j in [0,t] 。有如下状态转移方程: f(i,j) = begin{cases} 0 & (初始化)

  • 棘手的部分是,我实际上有两个参数包,我需要处理。它们最初将打包在一起,但我想使用模板专门化来拆分它们。接下来是我做这件事的尝试。 如果它不明显(由于模板参数列表中的auto关键字),这是使用C++17。 这个想法是有一个包装器,它看起来像 编辑:修正了rvalue引用限定符的过度使用,以避免混淆。