ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-31 00:38 | 显示全部楼层
本帖已被收录到知识树中,索引项:递归
66327823 发表于 2014-3-30 17:30
川老师,等于100的组合有很多,我想找出1-100这些数只用一次的所有组合。如1+99,2+98,3+97,4+5+6+85,等 ...

这个当然也可以做到,但得到的结果就会是所有有解组合中的不重复组合……

那么,如果你没有一个明确的规则的话,做起来就很伤脑筋……
比如1+99=100用过了以后,那么以后所有含1的组合都不能再用了……这回漏掉很多组合的。

那么,你实际需要的是1 一定要和99组合吗?
还是允许 1+2+97=100呢?


当然,如果你没有任何限制,随便取出一些组合直到剩余最后几个无法组合成=100就算结束。
这样的代码可以有。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-31 00:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这个例子就是从一堆数中抽取符合条件的组合,直到剩余元数无法满足求和条件时停止。

但显然这样得到的结果,只是成千上万种所有可能解组合中的一种。

Split Combin_kagawa.zip

17.5 KB, 下载次数: 516

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-3-31 12:33 | 显示全部楼层
谢谢楼主提供这个牛的程序 解决了不少问题
请问一下 最终计算出组合 能不能实现 当选定某组合的格子时
该组合格子中 所涉及的数字 其原始表格 都自动高亮呢

TA的精华主题

TA的得分主题

发表于 2014-3-31 23:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
学习了,,,

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-4-1 11:49 | 显示全部楼层
善读书 发表于 2014-3-31 12:33
谢谢楼主提供这个牛的程序 解决了不少问题
请问一下 最终计算出组合 能不能实现 当选定某组合的格子时
该 ...

当然可以,而且并不复杂……

选中G列后,激活SelectiChange事件,即可自动分析、查找、高亮该行组合。

…………
但是我在本帖附件中放弃了这个做法,因为如果对象组合元素中有重复时会产生干扰。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-4-1 11:59 | 显示全部楼层
善读书 发表于 2014-3-31 12:33
谢谢楼主提供这个牛的程序 解决了不少问题
请问一下 最终计算出组合 能不能实现 当选定某组合的格子时
该 ...
  1. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  2.     If Target.Count > 1 Then Exit Sub
  3.     If Target.Column <> 8 Then Exit Sub
  4.     If Target = "" Then Exit Sub
  5.    
  6.     m = Range("A1").End(xlDown).Row
  7.     Range("A1").Resize(m).Interior.ColorIndex = 0
  8.     If Target.Row = 1 Then Exit Sub
  9.    
  10.     sj = Range("A1").Resize(m)
  11.     Set d = CreateObject("Scripting.Dictionary")
  12.     For i = m To 2 Step -1
  13.         d(CStr(sj(i, 1))) = i
  14.     Next
  15.    
  16.     t = Split(Target, "+")
  17.     For i = 1 To UBound(t)
  18.         Cells(d(t(i)), 1).Interior.ColorIndex = 6
  19.     Next
  20.    
  21. End Sub
复制代码
你把上边这段代码整体复制、粘贴到Sheet1的代码页中,然后就可以有这个功能了。

使用方法:
1. 组合凑数计算完成后,选中H列(有+号表达式的那一列)
然后A列对应数值就会高亮显示(单元格底色黄色)

2. 选中H1单元格时即可取消A列全部底色


呵呵。自己复制试一试吧。

但是提醒你,如果A列中数据有较多重复,则可能出错。
另外,可能会因为数据小数点显示误差而导致错误。

因为有可能出错,所以我没有加入我的正式程序中。

但你如果自己方便要用,可以自己加进去,做个提醒还是有用处的。

TA的精华主题

TA的得分主题

发表于 2014-4-1 18:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
收藏学习了

TA的精华主题

TA的得分主题

发表于 2014-4-2 09:52 | 显示全部楼层
Ron2000 发表于 2014-1-3 10:07
支持香川大侠,看得出花很多时间整理、说明。加了参数配置,考虑了实际应用的很多情况!
组合计算以外,我的参数设置才是亮点。

一般人考虑不到那么细致的……女生的特长么、心细。
原來想穿裙子老師是大美女呀,佩服

TA的精华主题

TA的得分主题

发表于 2014-4-6 15:10 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-4-8 10:44 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
确实是一种通用的方法,多谢!!!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 16:34 , Processed in 0.036434 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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