前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >记一道毫无思路的算法题

记一道毫无思路的算法题

作者头像
深蓝studyzy
发布2022-06-16 15:23:57
1960
发布2022-06-16 15:23:57
举报
文章被收录于专栏:深蓝居

今天贤内给了我一道很实际的算法题,把我彻底难住了,实在想不出来,于是写此博文以记之。

背景是这样的,现在有一个付款明细的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条明细的,就这破算法,那更是天文数字,怎么可能算得出来啊?!

 附上现有的代码下载

更新:

好吧,看来我太无知了,这个问题是没有解决办法的,StackOverflow的讨论:http://stackoverflow.com/questions/4355955/subset-sum-algorithm

而且还有专门的维基百科页面:http://en.wikipedia.org/wiki/Subset_sum_problem#Pseudo-polynomial_time_dynamic_programming_solution

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-10-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档