ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 香川群子

[原创] 2014新年元旦第一强帖:实用凑数凑金额高效递归剪枝算法

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-6-30 15:30 | 显示全部楼层
本帖已被收录到知识树中,索引项:递归
东方神奇 发表于 2015-6-30 13:34
香川老师,请帮忙解决下问题,感激不尽!

你的问题很容易解决。

操作上,按发票日期顺序逐步添加数据。
比如,先加入5月1日-5月5日的数据,计算……
如果有结果,那就是你所谓的最优结果。

如果没有结果,那么再继续添加5月6日-5月8日的数据进行计算……
这样就可以了。

无需更改程序。(也没办法很简单就能搞定日期顺序的优先比较的。)

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-6-30 15:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
东方神奇 发表于 2015-6-30 11:47
香川老师, 对您的递归非常崇拜,
请教一个问题:能否得到一个最优结果(按照原始数据排序的最优结果), ...

你的问题可以通过逐批次添加数据来做到,无需更改程序。

① 加入第1批次日期,例如5月1日-5月5日,然后计算。
  如果有结果,那就是你的最优结果。

  如果没有得到解,那么:
② 加入第2批次日期,例如5月6日-5月10日,然后计算。
…………直到计算出你要的组合为止。

TA的精华主题

TA的得分主题

发表于 2015-6-30 15:47 | 显示全部楼层
没看明白,是否需要在A列添加日期? 或者默认添加一个序号也没问题的。

可能是我没有描述清楚,上个实例,从34个按照日期排序的数字中凑金额为405274.23的收款金额。
结果有64个,很难识别哪个组合是从上往下的得最佳核销组合。

勾兑发票.zip

27.94 KB, 下载次数: 30

TA的精华主题

TA的得分主题

发表于 2015-6-30 15:57 | 显示全部楼层
香川群子 发表于 2015-6-30 15:32
你的问题可以通过逐批次添加数据来做到,无需更改程序。

① 加入第1批次日期,例如5月1日-5月5日,然 ...

需要凑的金额是从网银记录中导出来核销的,
如果有100个金额需要凑,那么是不是只得出一个结果的运算速度回快点呢?

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-6-30 17:27 | 显示全部楼层
东方神奇 发表于 2015-6-30 15:47
没看明白,是否需要在A列添加日期? 或者默认添加一个序号也没问题的。

可能是我没有描述清楚,上个实例 ...

既然已经按日期排序,那么你自己当然是知道那几行是哪一天的发票金额。

操作很简单。
第1次,把1-n行数据(具体行数你自己根据日期顺序来定,例如1-10行)复制到程序中进行计算。

如果有解,那么就可以结束了……这就是你最理想的解。(日期小的顺序优先)

如果无解,那么这次增加几行(具体行数你自己根据新增日期范围来定),例如增加5行
那么就是把1-15行数据(增加了5行后变成15行)复制到程序中进行计算。

…………这样反复操作即可。



TA的精华主题

TA的得分主题

发表于 2015-6-30 20:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
香川群子 发表于 2015-6-30 17:27
既然已经按日期排序,那么你自己当然是知道那几行是哪一天的发票金额。

操作很简单。

如果手工操作复制是可以实现的,但是A列的数据经常需要变化,
就以第一次1-10行,后面每次增加5行来计算的话,能否帮助修改下程序?
直接识别最优的一个组合呢,谢谢了!

TA的精华主题

TA的得分主题

发表于 2015-7-25 19:28 | 显示全部楼层
香川群子 发表于 2014-1-1 15:07
彭版出的题目的帖子
http://club.excelhome.net/forum.php?mod=viewthread&tid=151178&page=7#pid6353576
...

香川老师,能否请您帮个忙呢?我这边有一个类似的数据,是用数据透视表做出来的,要求随机筛选出来的金额加总得到30%左右,希望涵盖更多的vendor和period。具体见附件,太谢谢了

数据 - Copy.zip

313.4 KB, 下载次数: 32

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-7-26 08:26 | 显示全部楼层
qianbin0503 发表于 2015-7-25 19:28
香川老师,能否请您帮个忙呢?我这边有一个类似的数据,是用数据透视表做出来的,要求随机筛选出来的金额 ...

【希望涵盖更多的vendor和period】……这个要求和随机性是冲突的。

你可以这么操作:
1. 复制粘贴要随机提取的数据
2. 设置求和范围,如 28%-32%
3. 用我的程序计算,然后挑选n(参与项最多)的那些组合结果

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-7-26 08:42 | 显示全部楼层
qianbin0503 发表于 2015-7-25 19:28
香川老师,能否请您帮个忙呢?我这边有一个类似的数据,是用数据透视表做出来的,要求随机筛选出来的金额 ...

找到14组解。涵盖最多行。(包括4个0 为50行)
总和        总比例        明细
119425963.5        30.000007%        +7800000+6980000+6552000+4700000+4513678+4107012+3755555.5556+3524970.4+3461832.45+3251384.5+3240000+3177777.7778+3000000+2839944.46+2839944.46+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2565111.11+2498587.001+2450397.8571+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+905840+14400+2916+2400+2088+1764+1440+960+960+0+0+0+0

119425927.5        29.999998%        +7800000+6980000+6552000+4700000+4513678+4107012+3755555.5556+3524970.4+3461832.45+3251384.5+3240000+3177777.7778+3000000+2839944.46+2839944.46+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2565111.11+2498587.001+2450397.8571+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+905840+14400+2880+2400+2088+1764+1440+960+960+0+0+0+0

119425999.5        30.000016%        +7800000+6980000+6552000+4700000+4513678+4107012+3755555.5556+3524970.4+3461832.45+3251384.5+3240000+3177777.7778+3000000+2839944.46+2839944.46+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2565111.11+2498587.001+2450397.8571+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+905840+14112+3240+2400+2088+1764+1440+960+960+0+0+0+0

119425987.5        30.000013%        +7800000+6980000+6552000+4700000+4513678+4107012+3755555.5556+3524970.4+3461832.45+3251384.5+3240000+3177777.7778+3000000+2839944.46+2839944.46+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2565111.11+2498587.001+2450397.8571+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+905840+13824+3000+2916+2088+1764+1440+960+960+0+0+0+0

119425951.5        30.000004%        +7800000+6980000+6552000+4700000+4513678+4107012+3755555.5556+3524970.4+3461832.45+3251384.5+3240000+3177777.7778+3000000+2839944.46+2839944.46+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2565111.11+2498587.001+2450397.8571+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+905840+13824+3000+2880+2088+1764+1440+960+960+0+0+0+0

119425963.5        30.000007%        +7800000+6980000+6552000+4700000+4513678+4107012+3755555.5556+3524970.4+3461832.45+3251384.5+3240000+3177777.7778+3000000+2839944.46+2839944.46+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2565111.11+2498587.001+2450397.8571+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+905840+13800+3000+2916+2088+1764+1440+960+960+0+0+0+0

119425927.5        29.999998%        +7800000+6980000+6552000+4700000+4513678+4107012+3755555.5556+3524970.4+3461832.45+3251384.5+3240000+3177777.7778+3000000+2839944.46+2839944.46+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2565111.11+2498587.001+2450397.8571+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+905840+13800+3000+2880+2088+1764+1440+960+960+0+0+0+0

119425987.5        30.000013%        +7800000+6980000+6552000+4700000+4513678+4107012+3755555.5556+3524970.4+3461832.45+3251384.5+3240000+3177777.7778+3000000+2839944.46+2839944.46+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2565111.11+2498587.001+2450397.8571+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+905840+13500+3360+2880+2088+1764+1440+960+960+0+0+0+0

119425996.9        30.000016%        +7800000+6980000+6552000+4700000+4513678+4107012+3755555.5556+3524970.4+3461832.45+3251384.5+3240000+3177777.7778+3000000+2839944.46+2839944.46+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2565111.11+2498587.001+2450397.8571+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+905840+13500+3333.3333+2916+2088+1764+1440+960+960+0+0+0+0

119425960.9        30.000007%        +7800000+6980000+6552000+4700000+4513678+4107012+3755555.5556+3524970.4+3461832.45+3251384.5+3240000+3177777.7778+3000000+2839944.46+2839944.46+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2565111.11+2498587.001+2450397.8571+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+905840+13500+3333.3333+2880+2088+1764+1440+960+960+0+0+0+0

119425922.6        29.999997%        +7800000+6980000+6552000+4700000+4513678+4107012+3755555.5556+3524970.4+3461832.45+3251384.5+3240000+3177777.7778+3000000+2839944.46+2839944.46+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2565111.11+2498587.001+2450397.8571+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+905840+13500+3259.1+2916+2088+1764+1440+960+960+0+0+0+0

119425987.5        30.000013%        +7800000+6980000+6552000+4700000+4513678+4107012+3755555.5556+3524970.4+3461832.45+3251384.5+3240000+3177777.7778+3000000+2839944.46+2839944.46+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2565111.11+2498587.001+2450397.8571+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+905840+13500+3240+3000+2088+1764+1440+960+960+0+0+0+0

119425975.5        30.000010%        +7800000+6980000+6552000+4700000+4513678+4107012+3755555.5556+3524970.4+3461832.45+3251384.5+3240000+3177777.7778+3000000+2839944.46+2839944.46+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2565111.11+2498587.001+2450397.8571+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+905840+13500+3000+2916+2400+1764+1440+960+960+0+0+0+0

119425939.5        30.000001%        +7800000+6980000+6552000+4700000+4513678+4107012+3755555.5556+3524970.4+3461832.45+3251384.5+3240000+3177777.7778+3000000+2839944.46+2839944.46+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2748333.33+2565111.11+2498587.001+2450397.8571+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+2250000+905840+13500+3000+2880+2400+1764+1440+960+960+0+0+0+0

TA的精华主题

TA的得分主题

发表于 2015-7-27 16:53 | 显示全部楼层
香川群子 发表于 2015-7-26 08:42
找到14组解。涵盖最多行。(包括4个0 为50行)
总和        总比例        明细
119425963.5        30.000007%        +7800000+698 ...

太感谢香川老师这么耐心的解答!真的是太受用啦~还有一个不情之请,不知香川老师可不可以在优化一下,把vendor的覆盖范围扩大一点呢?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 14:33 , Processed in 0.033822 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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