You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术问询: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背包场景下,贪心无法保证最优解。
  • 遗传/模拟退火算法:通过随机搜索+迭代优化,在可接受时间内得到近似最优解,适合对结果精度要求不极端、但追求处理速度的场景。

示例数据求解(动态规划实现)

你的示例数据如下:

Demandsquare footage
1010
25
510
125
710
1320

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:35:20