技术问询:square footage容量30 sqft时最大化Demand值的批量求解方法
大规模数据下的背包问题解决方案
问题本质
你遇到的是0-1背包问题:给定一组物品(每个物品对应Demand价值与square footage占用空间),要求在总空间不超过30 sqft的限制下,最大化总Demand价值。
解法选择(按数据规模适配)
1. 动态规划(中等规模数据首选)
如果空间限制(这里是30 sqft)固定且数值不大,哪怕物品数量上万,动态规划依然是高效且能得到最优解的方案。
- 核心逻辑:用一维数组记录每个空间容量下能达到的最大Demand值,遍历物品时从后往前更新数组,避免重复选取同一物品。
- 时间复杂度:
O(n*C)(n为物品数量,C为空间容量),这里C=30,即使n是10万,计算量仅为300万,完全可控。 - 空间复杂度:
O(C),仅需一个长度为31的数组即可。
2. 启发式算法(超大规模数据适用)
当物品数量达到百万级以上,或空间容量极大时,动态规划效率不足,可选用近似最优的启发式算法:
- 贪心算法:仅适用于允许拆分物品的场景(分数背包),按「单位空间Demand值」从高到低排序,优先选取单位价值最高的物品。但0-1背包场景下,贪心无法保证最优解。
- 遗传/模拟退火算法:通过随机搜索+迭代优化,在可接受时间内得到近似最优解,适合对结果精度要求不极端、但追求处理速度的场景。
示例数据求解(动态规划实现)
你的示例数据如下:
| Demand | square footage |
|---|---|
| 10 | 10 |
| 2 | 5 |
| 5 | 10 |
| 12 | 5 |
| 7 | 10 |
| 13 | 20 |
Python代码实现
# 示例物品列表:(Demand, square footage) items = [(10, 10), (2, 5), (5, 10), (12, 5), (7, 10), (13, 20)] max_capacity = 30 # 初始化dp数组,dp[c]表示容量为c时的最大Demand总和 dp = [0] * (max_capacity + 1) for demand, area in items: # 从后往前遍历容量,避免重复选择同一物品 for c in range(max_capacity, area - 1, -1): dp[c] = max(dp[c], dp[c - area] + demand) print(f"最大Demand总和: {dp[max_capacity]}") # 输出:29(对应组合:Demand12+10+5+2,总空间5+10+10+5=30;或12+10+7,总空间25)
注意事项
- 如果物品允许拆分(即可以选部分物品),直接用贪心算法即可,按
Demand/square footage排序后优先取单位价值高的,能快速得到最优解。 - 若需记录具体选中的物品,可在动态规划过程中额外维护一个选择追踪数组,回溯得到最终选中的物品集合。
内容的提问来源于stack exchange,提问作者N State
相关产品推荐
相关产品推荐

