标签:style blog http ar 使用 sp 数据 on 问题
今天贤内给了我一道很实际的算法题,把我彻底难住了,实在想不出来,于是写此博文以记之。
背景是这样的,现在有一个付款明细的Excel,里面有为哪个发票,哪个公司应付多少钱的明细,明细数据是62条,现在知道我们已经付出的金额为Sum,请问到底哪些发票是已付款的。
这是62条明细数据:
| 653165.00 |
| 356029.11 |
| 220896.45 |
| 146362.00 |
| 1847670.00 |
| 3018518.91 |
| 1347553.07 |
| 145010.74 |
| 339784.84 |
| 199350.28 |
| 1206114.00 |
| 882000.00 |
| 253246.13 |
| 720000.00 |
| 24194.07 |
| 1518952.00 |
| 139453.48 |
| 200415.00 |
| 812044.00 |
| 9032764.57 |
| 3960608.05 |
| 1855126.31 |
| 7409087.18 |
| 608094.66 |
| 225519.59 |
| 627912.23 |
| 109897.52 |
| 1215819.87 |
| 4220245.50 |
| 94299.00 |
| 96547.00 |
| 92616.01 |
| 597100.54 |
| 880440.00 |
| 343991.59 |
| 70468.19 |
| 1092418.47 |
| 66911.94 |
| 80138.65 |
| 1398551.14 |
| 172287.48 |
| 691097.86 |
| 2371693.44 |
| 3773148.63 |
| 83898.33 |
| 89922.75 |
| 2619220.46 |
| 1179477.63 |
| 3440250.98 |
| 700000.00 |
| 997545.00 |
| 272523.00 |
| 3009976.00 |
| 451891.44 |
| 2111314.00 |
| 306377.00 |
| 142329.00 |
| 2057178.00 |
| 9340.00 |
| 249027.00 |
| 60811.50 |
| 51188.50 |
付款的金额为:
35857936.42
这听起来是一个很简单的算法题,其实就是算组合嘛,把每种组合的金额进行相加,如果等于Sum金额,那么就输出这种组合。于是网上找找组合函数的代码,很快就写出了这个程序。而且使用了一些简单的测试程序,确认计算是正确的。但是真正用到这个事情中,却崩溃了,计算量太大,根本算不出来。
仔细一想,对于每个数字,要么出现,要么不出现,那么其计算复杂度就是O(2^n),这里n=62,那么差不多就得计算2的62次,遍历每一种组合,才能找到全部答案。天啊!2的62次方!
根本不可能完成啊。想了又想,怎么都没有想到好的办法把复杂度降下来,伤心。不知道有没有大神能够解决这个问题。
这还只是一次数据,以后说不定还有100条明细,200条明细的,就这破算法,那更是天文数字,怎么可能算得出来啊?!
附上现有的代码下载。
标签:style blog http ar 使用 sp 数据 on 问题
原文地址:http://www.cnblogs.com/studyzy/p/4046331.html