【100分】请列出从n中取m个数的所有组合,不分顺序 个数很容易求,n!/m!(n-m)!(n>m,m>0)但这里要求列出来谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 例子:n=123,所有组合是:m=11,2,3,m=212,13,23,m=3123 n={1,2,3,4}m=1:1,2,3,4m=2:12,13,14,23,24,34m=3:123,124,134,234,m=4:1234 $arr = array(1, 2, 3, 4);composeList($arr, 2);function composeList($from = array(), $num = 0, $to = array()){ if(($count = count($to)) == $num) { echo join(',', $to) . '<br />'; return; } if($num < 0 || ($count == 0 && count($from) < $num)) { echo 'Err'; return; } foreach($from AS $k => $v) { $to[] = $v; unset($from[$k]); composeList($from, $num, $to); array_pop($to); }} /** * 获得组合数 * @param $elements 可选的数 * @param $chosen 每个组合的个数 * @return $result 可生成的组合 */ function array_combination(array $elements, $chosen) { $result = array(); if(count($elements)<=$chosen)return array($elements); $elements=array_values($elements); for ($i = 0; $i < $chosen; $i++) { $vecm[$i] = $i; } for ($i = 0; $i < $chosen-1; $i++) { $vecb[$i] = $i; } $vecb[$chosen - 1] = count($elements) - 1; $rs=array(); foreach ($vecm as $key=>$v)$rs[$key]=$elements[$v]; $result[] = $rs; $ = $chosen - 1; while (true) { if ($ == 0) { $vecm[0]++; $rs=array(); foreach ($vecm as $key=>$v)$rs[$key]=$elements[$v]; $result[] = $rs; if ($vecm[0] == $vecb[0]) { for ($i = 1; $i < $chosen; $i++) { if ($vecm[$i] < $vecb[$i]) { $ = $i; break; } } if (($i == $chosen) && ($vecm[$chosen - 1] == $vecb[$chosen - 1])) { break; } } } else { $vecm[$]++; $--; for ($i = 0; $i <= $; $i++) { $vecb[$i] = $vecm[$i] = $i; } $vecb[$] = $vecm[$ + 1] - 1; $rs=array(); foreach ($vecm as $key=>$v)$rs[$key]=$elements[$v]; $result[] = $rs; } } return $result; } 有php高手的 收藏!! swfupload之前好的,现在错误500 php表单 接收参数 php里用Fckeditor上传flash文件显示不出来 大型的B2C网站跑PHP一定要在linux下吗? php 关于文本留言本“编辑用户留言”的问题 php与sql server2000的连接 大家最常用的PHP文本论坛是哪个啊 我想买空间大家给点意见,给分!!! 页面刷新! 请高手们帮忙,我现在数据库连不起来了,请大家看一看,小弟先谢了。 请问路径中 ./ 和 ../的区别 COMET和PHP SOCKET哪个更适合做聊天室?
m=1
1,2,3,
m=2
12,13,23,
m=3
123
m=1:1,2,3,4
m=2:12,13,14,23,24,34
m=3:123,124,134,234,
m=4:1234
composeList($arr, 2);
function composeList($from = array(), $num = 0, $to = array())
{
if(($count = count($to)) == $num)
{
echo join(',', $to) . '<br />';
return;
}
if($num < 0 || ($count == 0 && count($from) < $num))
{
echo 'Err';
return;
}
foreach($from AS $k => $v)
{
$to[] = $v;
unset($from[$k]);
composeList($from, $num, $to);
array_pop($to);
}
}
* 获得组合数
* @param $elements 可选的数
* @param $chosen 每个组合的个数
* @return $result 可生成的组合
*/
function array_combination(array $elements, $chosen)
{
$result = array();
if(count($elements)<=$chosen)return array($elements);
$elements=array_values($elements);
for ($i = 0; $i < $chosen; $i++) { $vecm[$i] = $i; }
for ($i = 0; $i < $chosen-1; $i++) { $vecb[$i] = $i; }
$vecb[$chosen - 1] = count($elements) - 1;
$rs=array();
foreach ($vecm as $key=>$v)$rs[$key]=$elements[$v];
$result[] = $rs;
$ = $chosen - 1;
while (true) {
if ($ == 0) {
$vecm[0]++;
$rs=array();
foreach ($vecm as $key=>$v)$rs[$key]=$elements[$v];
$result[] = $rs;
if ($vecm[0] == $vecb[0]) {
for ($i = 1; $i < $chosen; $i++) {
if ($vecm[$i] < $vecb[$i]) {
$ = $i;
break;
}
}
if (($i == $chosen) && ($vecm[$chosen - 1] == $vecb[$chosen - 1])) { break; }
}
} else {
$vecm[$]++;
$--;
for ($i = 0; $i <= $; $i++) {
$vecb[$i] = $vecm[$i] = $i;
}
$vecb[$] = $vecm[$ + 1] - 1;
$rs=array();
foreach ($vecm as $key=>$v)$rs[$key]=$elements[$v];
$result[] = $rs;
}
}
return $result;
}
收藏!!