求满足双兼容列表数量约束的元素选择最小总成本
满足双兼容条件的最小成本选取问题
问题明确
给定参数:
- 成本列表:
cost = [2,3,1,6,4](索引0-4,选取对应元素需支付对应成本) - 兼容标记1:
compatible1 = [1,1,0,1,0](值为1表示元素满足compatible1要求) - 兼容标记2:
compatible2 = [0,1,0,0,1](值为1表示元素满足compatible2要求) - 约束条件:选取的元素中,满足compatible1的数量至少为2,满足compatible2的数量至少为2
- 目标:找到满足约束的最小总成本(已知最优解为选取索引0、1、4,总成本9)
为什么贪心策略失效
你尝试的「优先选公共兼容项再选其他项」属于贪心思路,但这类策略仅能保证局部最优,无法覆盖所有全局最优的可能:
- 比如若公共兼容项成本极高,同时存在多个低成本的单兼容项,此时选4个单兼容项(2个满足compatible1,2个满足compatible2)的总成本,会远低于选公共项+补充单兼容项的成本。贪心策略会因为优先选高成本公共项,错过更优组合。
可行解法
方法1:枚举法(适用于元素数量少的场景)
先对元素按兼容属性分类:
- 类型A(仅满足compatible1):索引0、3,成本
[2,6] - 类型B(仅满足compatible2):索引4,成本
[4] - 类型C(同时满足双兼容):索引1,成本
[3] - 类型D(都不满足):索引2,成本1(直接排除,选它只会增加成本,无法帮满足约束)
枚举所有满足约束的组合,计算总成本取最小:
- 选0个C:需选≥2个A和≥2个B,但B仅1个,此组合无效。
- 选1个C:需选≥1个A和≥1个B。取A中成本最低的(2)、B中唯一元素(4),总成本
2+3+4=9。 - 选多个C:此案例仅1个C,无此可能。
最终最小成本为9,与已知最优解一致。
方法2:动态规划(适用于元素数量多的场景)
定义状态dp[i][a][b]表示考虑前i个元素时,已选a个满足compatible1的元素、b个满足compatible2的元素的最小成本。
状态转移规则:
对每个元素,分「选」或「不选」两种情况:
- 不选:
dp[i][a][b] = min(dp[i][a][b], dp[i-1][a][b]) - 选:
- 若元素双兼容:
dp[i][a+1][b+1] = min(dp[i][a+1][b+1], dp[i-1][a][b] + cost[i]) - 若仅满足compatible1:
dp[i][a+1][b] = min(dp[i][a+1][b], dp[i-1][a][b] + cost[i]) - 若仅满足compatible2:
dp[i][a][b+1] = min(dp[i][a][b+1], dp[i-1][a][b] + cost[i])
- 若元素双兼容:
最终答案为所有a≥2且b≥2的dp[n][a][b]中的最小值(n为元素总数)。
内容的提问来源于stack exchange,提问作者Ravi Sanka
相关产品推荐
相关产品推荐

