Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2590|回复: 7

在1-30的数据中,找出所有的和为30的数据

[复制链接]
发表于 2010-2-21 09:05 | 显示全部楼层 |阅读模式
用规划求解,不能找出全部答案;而用递归算法,数据一多,速度运行太慢了。考虑了很久,结合递归和规划求解,数据多了,还是不理想,请大家出手帮忙,谢谢!
发表于 2010-2-21 09:25 | 显示全部楼层

如果就30个数,还是手工算吧。

这类问题有什么实际的应用实例吗?

回复

使用道具 举报

 楼主| 发表于 2010-2-21 09:32 | 显示全部楼层

我是打个比方,数字不可能全部是整数,实际工作中象开增值税发票一类,要把几笔汇集一块填开,比如不能超过一千元,我也是看了网友类似的帖子,苦思冥想了很久,没有找到好的思路,请蓝桥老师帮着想想办法,感谢!
回复

使用道具 举报

发表于 2010-2-21 09:52 | 显示全部楼层

这个是彭希仁大师写的。A列放那些加数,B1放要得到的结果。运行CAI就行了。

 


Private arr(1 To 200), arr1, j, z, k, bb
Private arr3(1 To 65536, 1 To 1)

Sub cai()
Application.ScreenUpdating = False
aa = Timer
Columns("A:A").Select
Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
        :=xlPinYin
Range("C:i") = ""
z = [A65536].End(xlUp).Row
arr1 = Range("a1", Cells(z, 1))

For i = z To 1 Step -1
arr(i) = arr(i + 1) + arr1(i, 1)
Next i

j = 0
k = Cells(1, 2)
bb = 0

lj 1, k, ""

Range(Cells(1, 3 + bb), Cells(j, 3 + bb)) = arr3
MsgBox "找到 " & bb * 65536 + j & " 个解! 花费" & Format(Timer - aa, "0.00") & "秒"
End Sub
Sub lj(i, x, y$)
If x >= arr1(i, 1) And x <= arr(i) Then
   If x = arr1(i, 1) Then
    If j = 65536 Then
      Range(Cells(1, 3 + bb), Cells(j, 3 + bb)) = arr3
      j = 1
      bb = bb + 1
    Else
      j = j + 1
    End If
    arr3(j, 1) = y & arr1(i, 1) & "=" & k
   Else
    If i < z Then
       If x >= 2 * arr1(i, 1) Then lj i + 1, x - arr1(i, 1), y & arr1(i, 1) & "+"
       lj i + 1, x, y
    End If
   End If
End If
End Sub
回复

使用道具 举报

 楼主| 发表于 2010-2-21 10:17 | 显示全部楼层

感谢amulee老师,运行出现错误

 

 

在1-30的数据中,找出所有的和为30的数据

在1-30的数据中,找出所有的和为30的数据

回复

使用道具 举报

发表于 2010-2-21 10:23 | 显示全部楼层

QUOTE:
以下是引用amulee在2010-2-21 9:52:00的发言:

这个是彭希仁大师写的。A列放那些加数,B1放要得到的结果。运行CAI就行了。


Private arr(1 To 200), arr1, j, z, k, bb
Private arr3(1 To 65536, 1 To 1)

Sub cai()
Application.ScreenUpdating = False
aa = Timer
Columns("A:A").Select
Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
        :=xlPinYin
Range("C:i") = ""
z = [A65536].End(xlUp).Row
arr1 = Range("a1", Cells(z, 1))

For i = z To 1 Step -1
arr(i) = arr(i + 1) + arr1(i, 1)
Next i

j = 0
k = Cells(1, 2)
bb = 0

lj 1, k, ""

Range(Cells(1, 3 + bb), Cells(j, 3 + bb)) = arr3
MsgBox "找到 " & bb * 65536 + j & " 个解! 花费" & Format(Timer - aa, "0.00") & "秒"
End
  Sub
Sub lj(i, x, y$)
If x >= arr1(i, 1) And x <= arr(i) Then
   If x = arr1(i, 1) Then
    If j = 65536 Then
      Range(Cells(1, 3 + bb), Cells(j, 3 + bb)) = arr3
      j = 1
      bb = bb + 1
    Else
      j = j + 1
    End
  If
    arr3(j, 1) = y & arr1(i, 1) & "=" & k
   Else
    If i < z Then
       If x >= 2 * arr1(i, 1) Then lj i + 1, x - arr1(i, 1), y & arr1(i, 1) & "+"
       lj i + 1, x, y
    End
  If
   End
  If
End
  If
End
  Sub

阿童木,彭希仁,就是那个编象棋软件的吗?很牛的说

回复

使用道具 举报

发表于 2010-2-21 10:51 | 显示全部楼层

只编1个卒子过河,我就觉得很麻烦了,象棋,那么多规则 。。。。 我只能说,偶买嘎,太牛了。。。。
回复

使用道具 举报

发表于 2010-2-21 11:10 | 显示全部楼层

是那个

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-25 12:03 , Processed in 0.670685 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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