excel中任意几个数相加 等于一个已知数

我一共有19个数字 例如:A1 A2 A3....A19 ,这19个数字,任意几个数相加等于一个已知数。那19个数字是已知的。
比如:690
855
111708
64200
59920
6156.68
3284.57
3839.71
18468.88
14011
3799.93
389.61
11112.51
13142.94
16104.8
500
2618.46
19390.93
15364.05
这19个数字,任意几个相加 等于 223231.45

先分析一下,任意几个 ,也就是 取几个数不固定,可能一个 ,也可能十九个
这就需要一个循环
假设现在循环到10 了 任意取10个数, 19个里面任意取10个数,也就是19个中取10个的组合
=COMBIN(19,10)=92378,

循环 连同组合
=SUM(COMBIN(19,ROW(1:19)))=524287
共有524287中情况
实际上 就是2的 19次方
然后 在这五十多万种可能中找出符合条件的 ,
需要把这五十多万种组合逐一列出 很有难度啊

首选 构建一个 19位的 2进制数,循环,
不够是9位时 前面补零,对应的位数与 这个19个数对应
如果是零 这个数不取,如果是1 取

这样 所有的组合都会出现

我慢慢想想

等我 !我很有可能 解决这个问题!

我拿 100以内的19个数测试的,看那几个数的和可以等于345,
代码写出来了 循环太大,会报错 ,
如果把524287 缩小到200以内就没问题了,就不会报错了,但是循环次数就不够了,不能穷尽找出所有组合,

如果要是 10个数 中 取 应该不会有问题 反正代码理论没有问题,我半个小时写完代码,用了三个小时时间才查出来是 循环过大!

Sub 取任意数()
Dim i As Long
Dim tt As String
Dim su1 As Long
Dim su2 As Long
Sheets("Sheet1").Select
For i = 1 To 225
tt = Application.WorksheetFunction.Rept(0, 18) & Application.WorksheetFunction.Dec2Bin(i)

For j = 1 To 19
su1 = Mid(Right(tt, 19), 20 - j, 1) * Cells(j, 1)
su2 = su1 + su2
Next j

If su2 = 345 Then
For k = 1 To 19
aa = Mid(Right(tt, 19), 20 - k, 1) * Cells(k, 1)
If aa <> 0 Then
Cells(m + 1, b + 3) = aa
b = b + 1
End If

Next k
m = m + 1
b = 0
End If
su2 = 0
Next i
End Sub追问

兄弟~我确实没懂~我资质有限啊。能详细点吗。解决了 高分相送!前面的文字叙述我大概能明白,后面的代码真是一团雾水~

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-25
可以考虑用一下此方法:
将你的一堆数字放在A列中,
在C列中填入公式C1=A1*B1,向下填充到与A列相对应,另选一单元格或就在C列末尾单元格下一行(假设为C100),对C列求和.
在菜单"工具"->"规划求解",设置目标单元格为C100,值为"x",可变单元格选为B1:B99,"添加"约束对话框,单元格应用位置为B1:B99,下拉框中选择为bin,求解.
B列中为1的是相加可以等于x数的项.本回答被提问者采纳
第2个回答  2011-03-25
什么意思
第3个回答  2011-03-25
这是一个组合问题,用VBA实现是可以的,就是编程太麻烦了。追问

不能详细点?

追答

我正在想,思路是从1到19的组合之和种情况,答案可能不止一个,如何实现组合牵涉到N层的循环,短时间编不出来,在网上搜索看看有没有。
大体思路是:
设M=1到19循环,
  从19个数里选择M个数;(这是难点)
    求和并判断是否等于所需要的值,是则显本组合的M个数到指定位置
  选择结束
循环结束

追问

是这个道理,但是怎么操作呢?哎~

追答

当年线形代数没学好啊,否则这个问题很容易解决的.
向楼下的学习啊,很好的解决办法。
谢谢再“世纪晓岚”和“eyehappy_only ”,让我的知识得到丰富。