求解满足双工时约束的最大可生产独特车辆数问题
可生产最大独特汽车数量的解题思路
问题核心
从带重复元素的工时数组中,选出两个无重叠元素的子集,分别满足子集总工时≤对应工厂的可用工时,求两个子集的总元素数最大值(每辆车只能被选一次,重复元素代表不同车辆但工时相同)。
关键思路
1. 先排序,优先聚焦小工时车辆
把工时数组从小到大排序,小工时的车辆更容易组合出更多数量,能帮我们更快找到最优解。比如测试用例1排序后为[3,4,5,5,6],测试用例2为[5,5,6]。
2. 从最大可能数量倒推验证
我们不需要枚举所有组合,而是从最大可能的总数量开始往下验证,找到第一个可行的数量就是答案:
- 先判断数组总工时是否≤两个工厂工时之和,若是直接返回数组长度(所有车都能生产)。
- 否则,从
数组长度-1开始,依次尝试更小的数量,验证是否能将选出的k辆车拆分为两个子集,分别满足两个工厂的工时限制。
3. 验证时的剪枝与去重
验证k辆车的可行性时:
- 优先选小工时的车辆,尝试拆分两组,一组凑≤工厂A工时,另一组凑≤工厂B工时。
- 遇到重复工时的车辆,跳过重复的选择逻辑,避免重复计算相同组合(比如两个5,选第一个5后,就不要再以第二个5作为同位置的选择)。
示例验证
- 测试用例1:数组总工时23,8+9=17<23,无法生产5辆车。尝试4辆车:选
3,4,5,5,拆分3+5=8(工厂A)、4+5=9(工厂B),满足条件,返回4。 - 测试用例2:数组总工时16=8+8,但无法将3辆车拆分为两组和均为8的子集。尝试2辆车:选
5+6,分别放入两个工厂(5≤8、6≤8),满足条件,返回2。
优化实现方向
如果数组规模较大,可结合动态规划预计算单个工厂能容纳的最大车辆数:
- 用
dp[s]表示工时和为s时,最多能选的车辆数。 - 枚举工厂A的所有可能子集和
s1(≤工时A),对应车辆数k1,再从剩余元素中找工厂B能容纳的最大车辆数k2,取k1+k2的最大值。
内容的提问来源于stack exchange,提问作者ViridTomb
相关产品推荐
相关产品推荐

