記一道毫無思路的演算法題

2021-09-22 12:15:06 字數 1697 閱讀 2569

今天賢內給了我一道很實際的演算法題,把我徹底難住了,實在想不出來,於是寫此博文以記之。

背景是這樣的,現在有乙個付款明細的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的討論:

而且還有專門的維基百科頁面:

一道關於拆分思路的演算法題

2012 04 15 wcdj 1912.04.14 titanic,100 years later 題目 兩個陣列a n b n 其中a n 的各個元素值已知,現給b i 賦值,b i a 0 a 1 a 2 a n 1 a i 要求 1.不准用除法運算 2.除了迴圈計數值,a n b n 外,不...

一道演算法題,看看大家的思路

題目描述 有31,41,59,26,53,58,97,93,23,84十個數。sum n,m 表示從第n個數到到第m個數的和。例如 sum 2,3 41 59 18。問 最大的和是多少?對應的n和m是多少?這個題目並不難,實現的方法多種多樣。最壞的演算法,遍歷所有的情況,求出最大和。我在這兒提乙個演...

記一道DP題

給定 n l r 求長度為n的 且元素在 l r 的 且 陣列元素和是3的倍數的 陣列的 個數 dpmod0 表示區間內的數mod 3 0的個數 mod1 mod2 同理 dp i j 表示 長度為i的 陣列元素mod 3 為 j 的陣列的個數 如果 i 1長度的陣列和 mod 3 0 那麼我再加乙...