|
楼主 |
发表于 2021-5-8 18:24
|
显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
希望使用者好好看一下代码变量的简单注释,这样才能搞清楚程序参数的各种具体应用方法。
' 《凑数、凑金额的实用多功能强化版》 by kagawa 2014-01-01
' 2017-7-7更新 增加回溯 以便快速计算得到部分结果
' 2021-4-21 数值由Long整数改为CDec十进制数计算模式
' 2021-5-8 增加关联值汇总计算、重复值可选择字典去重复 或不去重复保留所有组合(关联值不同时)
' 经Excel Home 香川群子 的深入研究, 采用排序以后的差值递归、末位搜索、
' 当前位超过剩余值剪枝、当前位剩余和不足剪枝、递归计算深度参数控制等技
' 最后产生了目前最好的Excel VBA 高速高效的组合求和递归剪枝算法。
' 可处理小数、负数、重复数等各种情况
' 通过指定小数位数、指定目标和值范围、组合个数范围、指定求解个数、递归计算深度等参数使用
' 可以得到很多有趣的效果、可以满足几乎所有之前要求凑数、凑金额的求助帖子
' 我愿意公开此代码以便大家使用和学习
'========================================================================================
Dim sj(), jg(), dic, d&, d2&, h, h0#, h1, h2, h3#, k&, l&, l2&, m&, n&, n2&, t2&, cnt&, cnt0&, cnt1&, cnt2&, tms#
'递归用公用变量定义:
' sj(): 存放递归用原始数据的数组,已经过升序预处理含[原始数值]、[小数位转换为十进制数值]、[剪枝用累计和]
' jg(): 存放递归计算结果的数组,含组合个数、组合总和、组合明细、递归计算深度
' dic: 原始数据有重复时用来排除重复的字典dic
' d: d=[f3] 指定小数位数d
' d2: [f12]=d2 元素重复个数(有重复元素时使用字典排除重复组合)
' 起始设置=-1时,不排除重复【关联汇总对象不同时】
' h: h=[f1] 目标和值 转为Dec十进制数
' h0#: 目标和值下限 双精度原始值
' h1: [f11]=h1 有负数时负数累计总和h1
' h2: h2=[f2] 目标和值上限。并计算转换为和值的向上范围 转为Dec十进制数
' h3#: 目标和值上限 双精度原始值
' h和h2 有3种组合类型:
' [h,0]→[h,h]输出完全匹配=h的组合;
' [h<h2]输出[h,h2]范围组合; 即以h为下限、h2为上限的求和范围
' [h2<h]输出[h,h+h2]范围组合。即以h为下限 h2为差值 h+h2为上限的求和范围
' k: [f7]=k 组合结果存入jg数组时的序号、计算得到的组合结果总数
' l: l=[f6] jg()数组的最大下标=限制计算以及输出到工作表的最大行数l
' 留空时不限制计算、但输出默认为<65530行
' l=-1时输出组合结果到本文件所在文件夹下的txt文本文件
' l2: 统计组合结果文本长度最大值超过911时不能进行数组输出,只能逐行输出
' m: 原始数据中待组合元素个数m
' n: n=[f4] 指定组合元素个数下限n
' n2: n2=[f5] 指定组合元素个数上限n2
' n和n2 共有4种组合类型:
' [0,0]→[0,m]输出全部组合;[n,0]→[n,n]匹配=n的组合;
' [0,n2]→输出0-n2范围组合;[n,n2]→输出n-n2组合。
' t2: t2=[f14] 允许回溯时的t值限制 有扩大计算深度的效果
' cnt: [f8]=cnt 递归计算次数
' cnt0: cnt0=[f15] 递归计算深度(默认留空时=2^16即65536次递归)
' 初次计算无解则可改输入=-1 就会遍历计算全部组合(计算量太大可能会陷入假死循环)
' cnt1: 递归计算深度 有解时归零、或未达到允许回溯的t值时归零
' cnt2: [f13]=cnt2 递归计算深度的最大值记录
' A列序号
' B列凑数对象:个数或金额或任意含小数的数值
' C列关联汇总对象:B列凑数值组合相加求和在目标和值范围内时、同时输出其C列也能相加汇总的关联值的总和
' 计算完成后 选N列点按钮黄色高亮序号、选O列点按钮黄色高亮B列组合 选第1行后点按钮则消除黄色底色
|
评分
-
6
查看全部评分
-
|