作者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