相关疑难解决方法(0)

找出一组中的数字组合加起来给定的总数

我的任务是帮助一些会计师解决他们遇到的常见问题 - 给出交易清单和总存款,哪些交易是存款的一部分?例如,假设我有这个数字列表:

1.00
2.50
3.75
8.00
Run Code Online (Sandbox Code Playgroud)

我知道,我的存款总额是10.50,我可以很容易地看到它弥补了中8.002.50交易.然而,鉴于一百笔交易和数百万美元的存款,它很快变得更加困难.

在测试蛮力解决方案(花费太长时间以实现)时,我有两个问题:

  1. 有了大约60个数字的列表,它似乎找到了十几个或更多的组合,任何合理的总数.我期待一个单一的组合来满足我的总数,或者可能是一些可能性,但似乎总是有很多组合.是否有一个数学原理描述了为什么会这样?看来,即使是中等大小的随机数集合,您也可以找到多个组合,几乎可以达到您想要的总数.

  2. 我为这个问题建立了一个强力解决方案,但它显然是O(n!),并且很快失控.除了明显的快捷方式(排除大于总数的快捷方式),有没有办法缩短计算时间?

我当前(超慢)解决方案的详细信息:

详细信息量列表从最大到最小排序,然后以下过程以递归方式运行:

  • 获取列表中的下一个项目,看看是否将其添加到运行总计中使您的总匹配成为目标.如果是,请将当前链作为匹配项.如果未达到目标,请将其添加到运行总计中,将其从详细信息量列表中删除,然后再次调用此过程

通过这种方式,它可以快速排除较大的数字,将列表缩小到只需要考虑的数字.但是,它仍然是n!似乎永远不会完成更大的列表,所以我对我可以采取的任何快捷方式感兴趣 - 我怀疑即使从列表中删除1个数字也会将计算时间缩短一半.

谢谢你的帮助!

algorithm math accounting nested-loops

20
推荐指数
2
解决办法
6万
查看次数

标签 统计

accounting ×1

algorithm ×1

math ×1

nested-loops ×1