是否有一个 Excel 函数来查找数字的组合

C-L*_*511 4 excel vba solver

我对excel的所有功能和数据工具并不熟悉,但我对excel很熟悉。我的问题是我在电子表格上有一个数字,它是列表中许多不同数字的组合。

例如:

一个列表包含:100、200、250、500和1000,我需要解释的数字是:800

答案是 500, 200, 100

用简单的数字在我的脑海中做一个简短的列表并不难,但我正在处理超过 1500 个货币单元格 ($xxxx.xx),它们总计(并不是所有的都被使用,所以SUM没用)——我需要了解哪些数字用于创建该总数(这不是公式,而是硬编码数字)。

问题:是否有一个函数或 VBA 可以系统地组合给定范围内的数字,直到它确定可以将哪些数字加在一起以形成总数?

我只是想在我深入研究并开始自己编写蛮力算法之前知道。

========

编辑:我创建的解决方案,附在下面

链接到我为此创建的文件:https : //drive.google.com/file/d/0B8nE67gSOkewWXR2WnRuQTc2MEU/view?usp=sharing

感谢所有做出贡献的人!

Tet*_*esh 5

您可以SOLVER在excel中使用以获得结果。

您可以在其中激活它ADD-INS,它应该显示在DATA选项卡中。

您可以像这样设置电子表格:

在一列中您有数字列表 您要检查 下一列是全零 (0) 第三列是 First*Second(例如 100 * 0),因此在开始时所有行的零

比您添加第三列的摘要,它也应该为零。此数据的示例如下:

100 0   0
200 0   0
500 0   0
50  0   0
60  0   0
80  0   0
120 0   0
90  0   0
TOTAL   0
Run Code Online (Sandbox Code Playgroud)

现在您运行solver表单data选项卡并获得您必须提供参数的界面:

目标值是具有所有乘法之和的 CELL 您正在寻找精确值(输入 800)

通过更改 cels:在第二列中选择零范围

添加THRE附加的限制(add按钮):零的范围必须>= than 0<= 1int,所以我们只有0和1为可能的结果(你必须重新选择添加其他限制范围内的所有时间)

现在按solve,一段时间后(取决于您的数据集的规模,从几秒钟到几分钟不等)它会将一些零更改为 1,指示哪些数字用于产生您的结果。

如果有多种可能的结果,它会选择他找到的一个,但不会表明还有更多,但再次运行可能会产生不同的结果。

这是我得到的结果:

100 1   100
200 0   0
500 1   500
50  0   0
60  0   0
80  1   80
120 1   120
90  0   0
TOTAL   800
Run Code Online (Sandbox Code Playgroud)


C-L*_*511 2

好的,找出最适合我的解决方案:

首先,我发现一些 vba 可以让你创建无限的二进制字符串(而不是 Excel 内置的 9 位)。然后,我使用此代码为此目的创建了一个 UDF...由于我正在处理 20-40“位”的块,因此这是绝对必要的。

其次,我制作了一个加 1 的计数器循环,然后更改二进制字符串以反映新数字。(1,10,11,100,101,110,111等)

第三,我编写了一个公式,将二进制字符串分开,并将每个 1 或 0 分配给它旁边的单元格中的相应数字。(只需使用LEN()RIGHT()、 和MID()函数即可识别 1 和 0)。

第四,我将每个值乘以它旁边的 1 或 0,然后将所有相乘数字的总和与我要查找的目标值进行比较。

100% 的情况下,如果给出干净的数据,它会找到解决方案(如果存在)。(不过,时间是一个因素,因为这是一个指数函数,所以位数越多,循环它们所需的时间就越长)

4 分钟内运行了约 300 万种组合,具体取决于几个因素

我重新编写了工作表,并通过设置5列(每列递增 1)并使计数器递增 5(而不是 1)来使速度加倍。