• 记一道毫无思路的算法题


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

    背景是这样的,现在有一个付款明细的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 

  • 相关阅读:
    如何写出优秀的代码[转载]
    [转载]Java中常用日期功能综合
    JS WebBrowser 实现打印预览
    想成为优秀的技术人员你必须做到的几件事情【转载】
    JS打印
    js阿拉伯数字转中文大写
    从 SQL Server 2005 中处理 XML
    Visual Studio 2005 Express October 2004 CTP完整版本的下载
    Debug和Release的区别
    ASP.NET 中的正则表达式
  • 原文地址:https://www.cnblogs.com/studyzy/p/4046331.html
Copyright © 2020-2023  润新知