解决背包的一种变化,其中物品的价值取决于背包中已经存在的物品
Solving a variation of the knapsack in which the value of an item depends on items that are already in the sack
我想解决以下问题:
我有一组N
项目,其中每对项目都有一个相互得分,我需要选择W
项目的组合,使总得分最高。
例如i,j,k
项的总分为
score(i,j) + score(i,k) + score(j,k).
为了避免经历所有N^W
可能的组合,我考虑对0-1
背包问题做一个变化,并通过这两个变化来解决动态规划:
- 设置所有的权重等于1(所以最终我将得到确切的
W
项目在我的麻袋) - 我将根据当前正在检查的物品和当时已经在麻袋中的物品"动态"计算值,而不是为每个物品设置一个常量数组。
我已经开始用这两个变化来编码解决方案,但是现在我想得更多了,我担心它不能用动态规划来解决,因为"最优子结构"属性不成立。
例如,如果W=3
和i,j,k
项是最优解,那么对于W=2
, i,j
不一定是最优解(根据上述总分的计算)。
有没有人知道这个问题是如何用动态编程来解决的,而不是用O(N^W)
暴力破解?
谢谢
你的问题是np困难的,这意味着几乎肯定没有快速的多项式时间算法来解决它,因为没有人能够想出一个多项式时间算法来解决np困难的问题。为了了解np硬度,假设你有一个图,其中节点是你的索引,如果在i和j之间有一条边,你定义i和j之间的分数为1,否则为0。如果你能在多项式时间内,找到包含最多W个节点的节点的最大分数子集,那么你就能在多项式时间内,算出图中是否存在一个大小为W的团。这是一个np完全问题
相关文章:
- C++模板来检查友元函数的存在
- 既然存在危险,为什么项目要使用-I include开关
- 我们可以访问一个不存在的联盟的成员吗
- C++:对不存在的命名空间使用命名空间指令
- 0-1背包代码中的错误.我的代码中有什么错误
- C++quit()函数中可能存在作用域问题
- C++擦除(如果存在)
- g++ 说函数不存在,即使包含正确的标头
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 有了gcc,是否可以链接库,但前提是它存在
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- C++Builder中的OnClick事件签名存在问题
- 如何正确地将分支添加到已存在的树中
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 如何检查QList中是否存在值
- 根据某个函数是否存在启用模板
- 如何将分支添加到已存在的TTree:ROOT
- 地图计数确实很重要,或者只是检查是否存在
- 解决背包的一种变化,其中物品的价值取决于背包中已经存在的物品