[问题] 求某数是由数列中的哪些数字加总?

楼主: hangchu (无瑕心灵的永恒灿烂阳光)   2013-06-05 10:58:40
各位大大好
我上一个发问的问题-“数字组合可能性”,其实是为了解决现在这个问题
目前已经写的出来数列的幂集合了,感谢回答的大大们
但是现在现实上的情况可能不适用于幂集合,因此再来请教
是这样的
现在要写一个程式,有一个数字及一数列,要求这一数字是由数列中的哪些数字加总的
非单一答案,所以要求显示各种组合性
举个例子: 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
而我的情况是,同一个组合里,同一个数字只能出现一次
所以和“找零钱问题”不太一样

Links booklink

Contact Us: admin [ a t ] ucptt.com