从m个数中选出n个数来 ( 0 < n <= m) ,要求n个数之间不能有重复,其和等于一个定值k。求一段程序,罗列所有的可能。例如备选的数字是:11, 18, 12, 1, -2, 20, 8, 10, 7, 6 。 和k等于:18

那么组合的可能有:

[18]
[8,10]
[2,20]
[12,6]
[11,7]
[11,1,6]
[1,10,7]
[12,-2,8]
[12,1,-2,7]
[11,1,-2,8]
云无心 的substr和array_diff_key已经用到出神入化了,解法很优美!
<?php
function getCombine($arr, $n) {
$len   =count($arr);
$total =pow(2, $len);
$ret   =array();
for ($i = 1; $i < $total; $i++) {
$str    =substr(str_repeat(“0”, $len) .decbin($i), $len);
$tmparr =array_diff_key($arr,array_diff(str_split($str),array(
‘1’
)));
if (array_sum($tmparr) == $n) {
$ret[] =implode($tmparr, ‘,’);
}
}
returnarray_unique($ret);
}
$data =array(11, 18, 12, 1, 2, 20, 8, 10, 7, 6 );
$n    = 18;
print_r(getCombine($data, $n));
方法中使用到的函数有

count() 函数计算数组中的单元数目或对象中的属性个数。

对于数组,返回其元素的个数,对于其他值,返回 1。如果参数是变量而变量没有定义,则返回 0。如果 mode 被设置为 COUNT_RECURSIVE(或 1),则会递归底计算多维数组中的数组的元素个数。

pow() 函数返回 x 的 y 次方。

decbin() 函数把十进制转换为二进制。

str_repeat() 函数把字符串重复指定的次数。

substr() 函数返回字符串的一部分。

str_split() 函数把字符串分割到数组中。

array_diff() 函数返回两个数组的差集数组。该数组包括了所有在被比较的数组中,但是不在任何其他参数数组中的键值。

在返回的数组中,键名保持不变。

array_diff_key() 函数返回一个数组,该数组包括了所有在被比较的数组中,但是不在任何其他参数数组中的键。

array_sum() 函数返回数组中所有值的总和。

implode() 函数把数组元素组合为一个字符串。

array_unique() 函数移除数组中的重复的值,并返回结果数组。

当几个数组元素的值相等时,只保留第一个元素,其他的元素被删除。

返回的数组中键名不变。

Tagged on:                             

发表评论