← 返回编程题库
coding-enumerate-hedge-decompositions中等免费版2000ms未尝试

对冲分解组合枚举

Enumerate Hedge Decompositions

开始编码

风险台收到 PM 的一笔新仓位,希望从手头一组备选对冲工具里挑出所有可行的对冲组合让残余 delta 落到目标区间内。每个备选 instrument 已经按市场价折算成「单位 delta 贡献」deltas[i](可正可负——比如卖出 future 是负 delta、买入 call 是正 delta)。给定一个目标残余 delta target 和容差 eps,请返回所有满足 |sum(deltas[s]) − target| ≤ eps 的子集 s

请实现 solution(deltas: list[float], target: float, eps: float) -> list[list[int]]。每个子集表示成它选中的 instrument 的索引列表(不是 delta 值列表——同 delta 不同 index 算不同子集)。每个内部子集按索引升序排序;外层顺序不限(评测会按多重集合比较)。空子集表示「不做任何对冲」,若 |0 − target| ≤ eps,它也是一个合法答案。

举例:solution([1.0, -1.0, 0.5, -0.5], 0.0, 0.0) 应返回(无序意义下) [[], [0, 1], [2, 3], [0, 1, 2, 3]]。空子集 sum 为 0 命中目标;[0, 1]1.0 + (−1.0) = 0[2, 3]0.5 + (−0.5) = 0[0, 1, 2, 3] 是 0。其他 12 个子集 sum 非 0 都不命中。

实现思路是 DFS 回溯加剪枝:每个 instrument 选 / 不选两叉递归,到叶子检查 |sum − target| ≤ eps。剪枝靠剩余可达区间——预计算 deltas[i..n−1] 的正部和 pos_suffix[i] 与负部和 neg_suffix[i],在递归位置 i 时若 [current_sum + neg_suffix[i], current_sum + pos_suffix[i]] 整体落在 target ± eps 之外,无论怎么选都不可能命中,立刻回溯。这一招在 n = 20 时把最坏情况的 2^20 次叶子访问剪到通常 1e3–1e4 量级。

约束条件

  • 0 ≤ len(deltas) ≤ 20
  • deltas[i] 是浮点,|deltas[i]| ≤ 1e6
  • target 是浮点,|target| ≤ 2e7;eps ≥ 0
  • 返回 list[list[int]]:每个内部子集是按 index 升序排序的 instrument 索引列表,外层顺序不限
  • 空子集(sum = 0)若满足 |0 − target| ≤ eps,则 [] 必须出现在结果中
  • 同一个子集只能出现一次;同 delta 不同 index 视为不同 instrument
  • 浮点比较允许 1e-12 量级容差

样例

Case 1 · statement example: zero target with exact pairs

输入: [[1,-1,0.5,-0.5],0,0]

期望: [[],[0,1],[2,3],[0,1,2,3]]

目标残余 delta = 0、容差 0,需要 sum 恰好为 0 的所有子集。空子集 sum = 0 命中;{0, 1} 是 1.0 + (−1.0) = 0;{2, 3} 是 0.5 + (−0.5) = 0;{0, 1, 2, 3} 是四项求和为 0。其余 12 个子集 sum 非 0,都不命中。返回顺序不限,但每个子集内部按 index 升序。

Case 2 · delta target with small tolerance: only full hedge fits

输入: [[0.3,0.2,-0.1,0.05],0.45,0.02]

期望: [[0,1,2,3]]

target = 0.45、eps = 0.02。所有 16 个子集里只有 {0, 1, 2, 3} 的 sum = 0.30 + 0.20 − 0.10 + 0.05 = 0.45 命中。次接近的 {0, 1} = 0.50 与 {0, 1, 2} = 0.40 距 target 都是 0.05,都超出容差。

最近提交

还没有提交记录。

编码区

实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。

加载编辑器...
计时0:00

默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。

Case 1 · statement example: zero target with exact pairs

输入: [[1,-1,0.5,-0.5],0,0]

期望: [[],[0,1],[2,3],[0,1,2,3]]

目标残余 delta = 0、容差 0,需要 sum 恰好为 0 的所有子集。空子集 sum = 0 命中;{0, 1} 是 1.0 + (−1.0) = 0;{2, 3} 是 0.5 + (−0.5) = 0;{0, 1, 2, 3} 是四项求和为 0。其余 12 个子集 sum 非 0,都不命中。返回顺序不限,但每个子集内部按 index 升序。

Case 2 · delta target with small tolerance: only full hedge fits

输入: [[0.3,0.2,-0.1,0.05],0.45,0.02]

期望: [[0,1,2,3]]

target = 0.45、eps = 0.02。所有 16 个子集里只有 {0, 1, 2, 3} 的 sum = 0.30 + 0.20 − 0.10 + 0.05 = 0.45 命中。次接近的 {0, 1} = 0.50 与 {0, 1, 2} = 0.40 距 target 都是 0.05,都超出容差。