Google Sheets:如何在有序数组中选取每列元素求最小总和
在Google Sheets中求解行列唯一选元素的最小总和
根据你的需求(每行、每列各选且仅选一个元素,求选中元素的最小总和,即经典指派问题),以下是两种可行的实现方法:
方法1:使用规划求解(Solver)工具
这是最直观且适用于绝大多数场景的方法:
- 准备辅助区域:在数据旁创建一个与原数组尺寸相同的空白区域(例如原数据为
A1:J10,辅助区用K1:T10),用于标记选中状态(选中填1,未选中填0)。 - 启用Solver:点击菜单栏「扩展程序」→「添加-ons」,搜索并安装「Solver」插件,安装完成后从「扩展程序」中打开它。
- 配置求解参数:
- 目标单元格:输入一个空白单元格,写入公式
=SUMPRODUCT(A1:J10, K1:T10),用于计算选中元素的总和。 - 目标类型:选择「最小值」。
- 可变单元格:选中刚才创建的辅助区域(
K1:T10)。 - 添加约束:
- 辅助区域的单元格必须是二进制值(
K1:T10 = binary),即只能为0或1。 - 每行的辅助单元格之和为
1(例如SUM(K1:T1)=1,下拉应用到所有行),确保每行仅选一个元素。 - 每列的辅助单元格之和为
1(例如SUM(K1:K10)=1,右拉应用到所有列),确保每列仅选一个元素。
- 辅助区域的单元格必须是二进制值(
- 目标单元格:输入一个空白单元格,写入公式
- 点击「求解」,Solver会自动算出最小总和,同时辅助区域会标记出选中的元素位置。
方法2:公式法(仅适用于小型数组)
如果数组规模很小(如5行5列以内),可以通过生成所有行列排列组合并计算总和的方式取最小值,但计算量会随数组规模呈阶乘增长,仅适合测试场景。例如:
=MIN(BYROW(PERMUTATIONA(SEQUENCE(10)),LAMBDA(p,SUM(INDEX(A1:J10,SEQUENCE(10),p)))))
注:PERMUTATIONA是Google Sheets的动态数组函数,需确保你的版本支持该函数。
补充:若无需限制行重复(仅每列选一个元素)
如果你的需求只是每列任选一个元素(可重复选同一行),直接求和每列的最小值即可,公式示例:
=SUMPRODUCT(BYCOL(A1:J10,LAMBDA(c,MIN(c))))
内容的提问来源于stack exchange,提问作者Johnny Eaton
相关产品推荐
相关产品推荐

