首页新闻找找看学习计划

设计一个算法计穷举哪些(目标中数字的和)与(源中数字和)一致

0
悬赏园豆:50 [已解决问题] 解决于 2019-03-06 09:29

【面试题求解】
编程题:请编写代码完成以下题目:
(1)随机生成一堆数字作为源
(2)随机生成一堆数字作为目标
(3)设计一个算法计穷举哪些(目标中数字的和)与(源中数字和)一致
(4)所设计的算法必须通过有效方法对产生的结果进行验证
例子:
源: 19,47,20,78,23
目标: 13,6,14,23,33,31,10
预期结果:
源19 = 目标 13 + 6
源47 = 目标 33 + 14
源47 = 目标 14 + 23 + 10
源19 + 47 = 目标 23 + 10 + 33

oneweek的主页 oneweek | 初学一级 | 园豆:159
提问于:2019-03-05 11:01
< >
分享
最佳答案
0

生成随机数有相关的方法,
穷举的话n个数有2的n次方减1种取法(去掉不取的)
源的每一种和目标的每一种比较是否相等
假如源有n个数,目标有m个数,总共要比较(2^n-1)*(2^m-1)次
那么如何将2^n-1种情况都取出来的,可以这样,将n个数放到数组里,每个数有个索引,一个数可以取可以不取,有两种情况,那我们不妨建一个n位的二进制数,每一位代表n个数的数组的索引,从1开始,每次加1,如果某一位上是1,就把数组中的这个索引的值取出来相加,这样二进制数加到2^n-1,正好有2^n-1种情况,对应数组的2^n-1种取法

收获园豆:40
流年飞雨 | 小虾三级 |园豆:1978 | 2019-03-05 11:20

good idear

Shendu.CC | 园豆:1914 (小虾三级) | 2019-03-05 12:26
其他回答(3)
0

先对目标做个排序,这样每次比源数据大的就不考虑了省了一笔时间,然后在范围内在进行比较,可以用线程或者并发处理,速度也会快一点

jqw2009 | 园豆:1946 (小虾三级) | 2019-03-05 11:15
0

对楼上的再补充一下,还有一种方法可以不用穷举2^n次,而是遍历 sum^2 次,sum是n个数的和。

方法是动态规划的思想,dp[i] = dp[j] +i-j 如果dp[j] 表示j 是求和而来的,如果i-j存在数组中,那么dp[i]也是可以求和而来。而路径就要用二进制的数字表示。

如果对于那种n基数比较大,但是数组里的数字不大,很合适。

收获园豆:10
Shendu.CC | 园豆:1914 (小虾三级) | 2019-03-05 14:42
0

有代码吗? 发来看看 ?...

~雨落忧伤~ | 园豆:334 (菜鸟二级) | 2019-03-17 11:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册