算法题 求一个数组中任意个元素的组合

2018-03-15 20:42:39 +08:00
 leonidas
碰到的一个 PHP 面试题

例如有个数组:
$arr = [1,2,3,4,5,6,7,8,9];
求出该数组任意个元素的组合,并不重复
类似
$result = [
[1,2],
[1,3],
[1,4],
[1,5],
[1,2,3],
[2,3,4],
...
...
];





-------------------------------------分割线-------------------------------------

扩展:
给出一个值,如:
$n = 20.2
求出上述数组中,任意个元素的组合相加后与该值最接近的组合

也就是类似说的背包问题



有大佬有解法吗,当时没有想到好的解法
1449 次点击
所在节点    问与答
6 条回复
sean10
2018-03-15 20:55:04 +08:00
ipwx
2018-03-15 21:07:28 +08:00
题目要求输出所有组合。所以数组长度必然不大,毕竟最后的存储空间要达到 sizeof(int) * n * 2^n 字节。所以我们假设 n < 32。所以可以 for (unsigned int i=0; i<(1<<n); ++i),然后在循环里面根据 i 的二进制位(是否为 1 ),选择元素,生成列表。
msg7086
2018-03-16 02:37:03 +08:00
扩展不是背包问题吧?
leonidas
2018-03-16 09:10:03 +08:00
@msg7086 嗯 类似背包问题
leonidas
2018-03-16 09:15:18 +08:00
@ipwx
@sean10
额 表示没看懂。。
msg7086
2018-03-16 09:21:20 +08:00
把数字转换成二进制,是 1 的位就选出对应的数字下标,是 0 就不选,然后本题应该是要去掉只有一个数的数组吧,过滤一下就好了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/438462

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX