就像经典的背包问题一样,我们希望在不使总重量超过容量的同时最大化总价值,并且它们的值和重量是独立的。但是,对于某些项目,如果要选择它,则必须选择其他一些项目。
例如:有item_1,item_2,...,item_n。如果要选择item_1,则必须选择item_3和item_5,如果要选择item_3,则必须选择item_2,item_7,item_9 ...等。
依赖关系是独立的,也就是说,如果我们绘制依赖关系图,它就只是一个“有向图”。
首先,我注意到“ 优先约束背包问题”和“ 部分有序背包问题”,但是在我的问题中,依赖项并不遵循反对称性(即,依赖关系图可能包含循环。
我发现最接近的问题是“ 集结背包问题”
给出一组项目,选择总值最大的子集,但要注意所选项目的总权重不超过固定容量。一组项目的总价值是各个价值的总和,总权重是各个权重的总和。在“联合背包问题”中,每个项目都有一个值,但是每个项目都具有一个元素集,而不是一个权重。每个元素都有权重。一组项目的总价值是各个值的总和,但总权重是相应集合的并集中元素的权重之和。
但是它仅结合“权重”,某些项目的价值可能会累加数次。
有什么办法可以有效地解决这个问题?
已编辑:
我找到了一种可以利用一些近似算法的方法
第1步。制作有向依存关系图
第2步。将此图转移到组件图(使用DFS查找牢固连接的组件)以删除周期
第3步。所以现在,这成为“ 优先约束背包问题”或“ 部分有序背包问题”。这些都是很强的NP完全性,但是有很多论文对此进行了讨论,并且可以找到一种近似算法来解决。
答案 0 :(得分:0)
在选择项目之前,您必须检查天气项目是否创建周期,如果创建周期,则将其丢弃并移至下一个项目。为此,您可以使用Kruskal的算法。