设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 5265|回复: 10
打印 上一主题 下一主题

[Access本身] [原创][源码][分享]排列组合问题

[复制链接]
跳转到指定楼层
1#
发表于 2009-10-12 12:27:30 | 只看该作者 回帖奖励 |正序浏览 |阅读模式


1.本例是利用位运算,把所有的结果列出来,然后根据元素是否出现得到结果,这个虽然不是最高效的,但是这个代码简单;
2.本列计算20个元素约需14秒,每多一个用时增加一倍,少一个减少一半;
3.实际应用于数据统计,比如财务回款。如银行回款1000元,又没有标发票号码(实际应用中经常这样),但是可能是几张发票的组合,这时候财务人员就很头疼了,不知道到底是那几张单子该注销,此时就可以用到本方法;
4.原来用剪枝法、迭代法写了两天都没有搞定,网上也没有找到更好的办法,就本问题如果哪位朋友有更好的办法,欢迎分享,谢谢!
5.为了测试方便,根据元素个数,自动生产一个连续数组,如:输入5,生成一个1,2,3,4,5的数组进行运算,实际应用中可用记录集给数组赋值。

代码如下:
Dim a() As Integer      '数组
Dim i, j, k As Integer  '循环变量
Dim total As Integer    '元素总数
Dim result As Integer   '结果值
Dim result0 As Integer  '中间值,循环时与结果值比较
Dim temp As Integer     '判断位置上是否有对应元素
Dim str As String       '中间结果
Dim display As String   '最终结果
Dim c As Integer        '计数器
Dim t As Date           '记录开始时间
t = Now()
total = txtTotal
result = txtResult
c = 0
'给数组赋值
ReDim a(total)
For i = 1 To total
    a(i) = i
Next
'----------
For j = 1 To 2 ^ total
    result0 = 0
    str = ""
    For k = 1 To total
        'temp = IIf((j And (2 ^ (k - 1))) = 0, 0, a(k))     '实践证明,用iif没有if then 快
        If (j And (2 ^ (k - 1))) = 0 Then: temp = a(k): Else: temp = 0
        If temp <> 0 Then str = str & "+" & temp
        result0 = result0 + temp
    Next
    If result0 = result Then
        display = display & result & " = " & Right(str, Len(str) - 1) & vbCrLf
        c = c + 1
    End If
Next
Me.Text3.Value = "共找到" & c & "个满足条件的组合,用时" & DateDiff("s", t, Now()) & "秒。结果如下:" & vbCrLf & vbCrLf & _
                 "--------------" & vbCrLf & _
                 display & _
                 "=============="

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

11#
发表于 2012-8-21 09:55:02 | 只看该作者
不错的知识点哦.
10#
发表于 2010-10-7 15:33:35 | 只看该作者
谢谢你了
9#
 楼主| 发表于 2009-10-18 18:11:52 | 只看该作者
点击结果,自动标出组合的位置!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
8#
 楼主| 发表于 2009-10-17 18:25:05 | 只看该作者
本帖最后由 wanshan 于 2009-10-17 18:27 编辑

V1.1增加了实际运用:



下一版本准备增加:点击结果,自动标出组合的位置!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
7#
发表于 2009-10-15 15:29:47 | 只看该作者
学习学习

点击这里给我发消息

6#
发表于 2009-10-15 11:16:18 | 只看该作者
写的不错,下了不少工夫
5#
发表于 2009-10-15 11:14:23 | 只看该作者
谢谢分享
学习学习
4#
发表于 2009-10-13 08:34:48 | 只看该作者
谢谢分享
3#
发表于 2009-10-12 21:21:05 | 只看该作者
谢谢分享~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-12-1 19:46 , Processed in 0.096835 second(s), 36 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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