小说网站的里面的搜索是怎么做的,手机做网站的软件,引流推广平台,温州外贸网站看到一个问题《关于#穷举#的问题#xff0c;如何解决#xff1f;(语言-开发语言)》#xff0c;对同一个数据存在“是/否”2种状态#xff0c;判断其是否参与计算#xff0c;并输出一系列数据的“是/否”状态的结果 目录 方法1#xff1a;二维数组组合函数结果 方法2如何解决(语言-开发语言)》对同一个数据存在“是/否”2种状态判断其是否参与计算并输出一系列数据的“是/否”状态的结果 目录 方法1二维数组组合函数结果 方法2二进制数结果 方法1二维数组组合函数
之前的文章《Excel·VBA二维数组组合函数、组合求和》可以对A-B列每行选择一种状态返回所有状态的组合对“原值”依次累加C-D列数值判断是否符合F2F3所需结果。以下代码调用了combin_arr2d函数如需使用代码需复制
Sub 穷举开关状态1()Dim arr, c, d, v, v1, v2, brr, b, sum1, sum2, write_col, iarr [a2:b9]: v [f1]: v1 [f2]: v2 [f3]write_col 8 输出结果写入起始列号c [c2].Resize(8, 1): c WorksheetFunction.Transpose(c) 单列转一维数组d [d2].Resize(8, 1): d WorksheetFunction.Transpose(d): tm Timerbrr combin_arr2d(arr) 调用函数返回组合一维嵌套数组For Each b In brrsum1 v: sum2 vFor i 1 To UBound(b)If b(i) 是 ThenIf Len(c(i)) Then sum1 Application.Evaluate(sum1 CStr(c(i)))If Len(d(i)) Then sum2 Application.Evaluate(sum2 CStr(d(i)))End IfNextIf Abs(Round(sum1 - v1, 6)) (0.1 ^ 6) And Abs(Round(sum2 - v2, 6)) (0.1 ^ 6) ThenCells(2, write_col).Resize(UBound(b), 1) WorksheetFunction.Transpose(b)write_col write_col 1End IfNextDebug.Print 累计用时 Format(Timer - tm, 0.00) 耗时
End Sub注意从上到下运算累计计算结果并非将计算式叠加后一次性计算结果
结果 方法2二进制数
开关只有“是/否”2种状态那么也可以用0和1表示这与二进制数一样之前的文章《python从数组中找出所有和为M的组合》采用过这种方法查找组合求和的结果那么本问题也可尝试 n个元素的全组合总数2 ^ n故8个元素的全组合数为256个即0-255转化为二进制数例如255的二进制数为“11111111”表示8个元素全部选择
Sub 穷举开关状态2()Dim c, d, v, v1, v2, s$, s1$, sum1, sum2, write_col, i, xv [f1]: v1 [f2]: v2 [f3]: Dim res(1 To 8)write_col 8 输出结果写入起始列号c [c2].Resize(8, 1): c WorksheetFunction.Transpose(c) 单列转一维数组d [d2].Resize(8, 1): d WorksheetFunction.Transpose(d): tm TimerFor x 1 To 2 ^ 8 - 1 注意-512 x 511s CStr(WorksheetFunction.Dec2Bin(x)): s Format(s, 00000000)sum1 v: sum2 vFor i 1 To Len(s)s1 Mid(s, i, 1): res(i) IIf(s1 1, 是, 否)If s1 1 ThenIf Len(c(i)) Then sum1 Application.Evaluate(sum1 CStr(c(i)))If Len(d(i)) Then sum2 Application.Evaluate(sum2 CStr(d(i)))End IfNextIf Abs(Round(sum1 - v1, 6)) (0.1 ^ 6) And Abs(Round(sum2 - v2, 6)) (0.1 ^ 6) ThenCells(2, write_col).Resize(UBound(res), 1) WorksheetFunction.Transpose(res)write_col write_col 1End IfNext
End Sub此种方法不足之处十进制转二进制Dec2Bin函数取值范围太小超过511就不适用元素个数变化时需要修改第3、5-8行的代码较为麻烦
结果 同样的原始数据输出结果相同但顺序不同