ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 小書生

[讨论] 函数,排列组合求最大

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-5-25 17:04 | 显示全部楼层
有浮点误差
  1. 10^MAX(-1^ISERR(DECIMAL(MMULT(10^MOD(INT(ROW(1:50366)/15^{3,2,1,0}),15),{1;1;1;1}),2))*MMULT(LOG(N(OFFSET(A2,MOD(INT(ROW(1:50366)/15^{3,2,1,0}),15),{0,1,2,3}))),{1;1;1;1}))
复制代码


没想到其他好的思路

评分

6

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-5-25 17:04 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
象山海鲜 发表于 2021-5-25 17:02
他的思路很好,每列各取4个最大值,实现起来很麻烦,要判断全部不同行才行。

取4大能想明白的,只不过本来组合就麻烦了,再考虑4大后的组合更坑了。

TA的精华主题

TA的得分主题

发表于 2021-5-25 17:11 | 显示全部楼层
本帖最后由 象山海鲜 于 2021-5-25 17:14 编辑
jivy1212 发表于 2021-5-25 17:04
取4大能想明白的,只不过本来组合就麻烦了,再考虑4大后的组合更坑了。

好像有误...比如第一列最大有5个,怎么提取他的位置呢?
我再理了理...............

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-5-25 17:13 | 显示全部楼层
象山海鲜 发表于 2021-5-25 17:11
好像有误...比如第一列最大有5个,怎么提取他的位置呢?
可能剩余的那个有对应别的行最大值,其他的都不 ...
  1. COUNTIF(OFFSET(A:A,,{0,1,2,3}),">"&A2:D16)<4
复制代码
这样取又不一定只是4个数

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-5-25 17:19 | 显示全部楼层
本帖最后由 小書生 于 2021-5-25 17:21 编辑
魚。。 发表于 2021-5-25 15:14
黑黑,只会循环和判断:

for a =1 to 15
  for b = 1 to 15
    for c = 1 to 15
     for d  =1 to 15
if a=b or b=c or c=d then
拉倒
if j < a*b*c*d then
j = a*b*c*d
end……
函数,思路有了,搞不出来,,VBa到时简单多了

TA的精华主题

TA的得分主题

发表于 2021-5-25 17:25 | 显示全部楼层
本帖最后由 魚。。 于 2021-5-25 20:41 编辑
魚。。 发表于 2021-5-25 15:14
黑黑,只会循环和判断:

vba的也优化一下,也是按照取每列前4来进行排列:

  1. Sub Fish3()
  2.     Dim aa, bb(1 To 256) As Long
  3.     Dim i&, j&, k&, l&, n&, temp#, t, MaxV&
  4.     t = Timer
  5.     aa = [a2:d16]
  6.         '--------------------------------> 添加行号:
  7.         For j = 1 To 4
  8.             For i = 1 To 15
  9.                 aa(i, j) = aa(i, j) + i / 100
  10.             Next
  11.         Next
  12.         '--------------------------------------------> 数据排序:
  13.         For j = 1 To 4
  14.             For i = 2 To 15
  15.                 temp = aa(i, j)
  16.                 For k = i - 1 To 1 Step -1
  17.                     If aa(k, j) >= temp Then Exit For
  18.                     aa(k + 1, j) = aa(k, j)
  19.                 Next
  20.                 aa(k + 1, j) = temp
  21.             Next
  22.         Next
  23.         '--------------------------------------------------------------------------------> 组合前4:
  24.         For i = 1 To 4
  25.             For j = 1 To 4
  26.                 For k = 1 To 4
  27.                     For l = 1 To 4
  28.                         If aa(i, 1) \ 1 - aa(i, 1) <> aa(j, 2) \ 1 - aa(j, 2) And aa(i, 1) \ 1 - aa(i, 1) <> aa(k, 3) \ 1 - aa(k, 3) _
  29.                             And aa(i, 1) \ 1 - aa(i, 1) <> aa(l, 4) \ 1 - aa(l, 4) And aa(j, 2) \ 1 - aa(j, 2) <> aa(k, 3) \ 1 - aa(k, 3) _
  30.                             And aa(j, 2) \ 1 - aa(j, 2) <> aa(l, 4) \ 1 - aa(l, 4) And aa(k, 3) \ 1 - aa(k, 3) <> aa(l, 4) \ 1 - aa(l, 4) Then
  31.                             If (aa(i, 1) \ 1) * (aa(j, 2) \ 1) * (aa(k, 3) \ 1) * (aa(l, 4) \ 1) > MaxV Then
  32.                                 MaxV = (aa(i, 1) \ 1) * (aa(j, 2) \ 1) * (aa(k, 3) \ 1) * (aa(l, 4) \ 1)
  33.                             End If
  34.                         End If
  35.                     Next l
  36.                 Next k
  37.             Next j
  38.         Next i
  39.     MsgBox "乘积最大值是:" & MaxV & ",用时" & Format(Timer - t, "0.0000秒")
  40. End Sub
复制代码


TA的精华主题

TA的得分主题

发表于 2021-5-25 17:28 | 显示全部楼层
cinlo 发表于 2021-5-25 14:53
一点思路没有啊。。。。。期待大神神作。。。我的想法是,求出每列前4大的值(因为第5大及更小的值肯定用 ...

是个好想法,我之前也这样想,就是不知道取出来该怎么组合。所以只能全部来一遍了 (哭)

TA的精华主题

TA的得分主题

发表于 2021-5-25 17:31 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2021-5-25 17:37 | 显示全部楼层
持续关注,头发少不少,怎么确定每行最大4个数的位置

TA的精华主题

TA的得分主题

发表于 2021-5-25 19:01 | 显示全部楼层
本帖最后由 魚。。 于 2021-5-25 21:32 编辑

强行取了一遍4列的前4,运算倒是快了,但是公式太长。应该可以优化的。脑阔疼,不想研究了。等着学习吧。

  1. =MAX(EXP(MMULT(LN(MOD(INDEX(LARGE({1,2,3,4}/1%+A2:D16,ROW(1:16)+(INT(ROW(4:19)/4)-1)*11),N(IF(1,MID(BASE(ROW(1:256)-1,4,4),{1,2,3,4},1)+{1,5,9,13}))),100)),{1;1;1;1}))*(MMULT(IFERROR(FIND(TEXT(COLUMN(A:O),"魚00"),TEXT(MMULT(MOD(INDEX(LARGE({1,2,3,4}/1%%+A2:D16/1%+ROW(1:15),ROW(1:16)+(INT(ROW(4:19)/4)-1)*11),N(IF(1,MID(BASE(ROW(1:256)-1,4,4),{1,2,3,4},1)+{1,5,9,13}))),100)*10^{6,4,2,0},{1;1;1;1}),REPT("魚00",4))),),ROW(1:15)^0)=22))
复制代码


评分

5

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-28 18:31 , Processed in 0.043429 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表