作者hangchu (無瑕心靈的永恆燦爛陽光)
站內Programming
標題[問題] 求某數是由數列中的哪些數字加總?
時間Wed Jun 5 10:58:40 2013
各位大大好
我上一個發問的問題-「數字組合可能性」,其實是為了解決現在這個問題
目前已經寫的出來數列的冪集合了,感謝回答的大大們
但是現在現實上的情況可能不適用於冪集合,因此再來請教
是這樣的
現在要寫一個程式,有一個數字及一數列,要求這一數字是由數列中的哪些數字加總的
非單一答案,所以要求顯示各種組合性
舉個例子: 90 是由 {30, 20, 50, 40, 60} 這些數字中的哪些數字加總起來的
可能組合性有..
組合一: 50 + 40 = 90
組合二: 30 + 60 = 90
組合三: 30 + 20 + 40 = 90
這個程式就是像這樣,要讓使用者輸入total和數列,程式再跑出所有組合情況
原本我的想法是用冪集合展開數列中所有數字的組合可能性,
讓各個組合做加總,加總後再去判斷哪個數字等於user輸入的total
等於total的那個組合就是答案了
想說這樣絕對不會miss,因為所有的組合性都會跑過、檢查過,正確性也有
但問題來了,這方式只適用數列個數很小的時候
當數列個數大於20的時候,程式就開始跑很久了
我算過當個數是30時,組合性有10億,每種組合要跑過的話,迴圈至少要跑10億圈
問過user,他們最多有可能到50個數字
所以想請教,有沒有什麼方式或演算法可以解決?
謝謝
另外,我問過數學系的朋友,他的回答也跟我的想法一樣
(就是冪集合的方式,一組一組檢查),可是這樣個數多時會很久
也想過「找零錢問題」
像是
http://tw.myblog.yahoo.com/dust512/article?mid=-2&prev=14&l=a&fid=5
可是「找零錢問題」的情況和我的問題不太一樣,「找零錢問題」的零錢面額可以有
很多個,例如:10元硬碟*n
而我的情況是,同一個組合裡,同一個數字只能出現一次
所以和「找零錢問題」不太一樣
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.33.32.180
1F:→ coolcomm:排序後從大的數開始取 儘早排除不可能的 115.80.157.129 06/05 11:19
2F:→ coolcomm:集合 115.80.157.129 06/05 11:19
3F:→ coolcomm:舉例來說 60+50=110 110>90 就不用在找 115.80.157.129 06/05 11:21
4F:→ coolcomm:其他包含這兩個數的集合了 115.80.157.129 06/05 11:21
5F:→ coolcomm:這樣應該可以? 當然 前提是你的數都是正 115.80.157.129 06/05 11:22
6F:→ coolcomm:數 115.80.157.129 06/05 11:22
7F:→ hangchu:數字都是正數,而且一定大於0 114.33.32.180 06/05 11:27
8F:→ hangchu:一定不會是小數,都是整數 114.33.32.180 06/05 11:28
10F:→ MOONRAKER:Dynamic Programming 118.163.12.174 06/05 17:51
11F:→ MOONRAKER:不對,抱歉 118.163.12.174 06/05 17:57
12F:→ suhorng:樓上說的沒錯 用DP對每一格求出 "有沒有解 118.166.59.251 06/05 20:28
13F:→ suhorng:, 遞迴印解時避開 "沒有解" 的部份 118.166.59.251 06/05 20:28
14F:推 bigpigbigpig:可以試試backtracking(回溯)法 :) 1.169.138.224 06/05 20:49
17F:→ hangchu:謝謝大家,我寫出來了 114.41.96.91 06/13 22:05
18F:→ hangchu:謝謝DJWS大大的程式,幫忙很多,感謝^^ 114.41.96.91 06/13 22:06