数组元素组合问题,谢谢
我要分成这样的两份,
1 234
2 134
3 124
4 123
12 34
13 24
14 23
数组的元素的个数是动态的,有什么算法呢,
谢谢各位大侠。
分组的依据就是分成两组,
考虑到各种组合,
和顺序没关系,哪个开头无所谓的
一共是N!个
最简单的算法就是f(r1,r2..rn)=r1f(r2..rn)+r2f(r1,r3..rn)+r3+f(r1,r2,r4..rn)+...
我用python写了一个
def perm(A):
res=[]
if len(A)==1:
return [A]
else:
for a in A:
rest=A.replace(a,'')
t=str_mul(a,perm(rest))
res.extend(t)
return res
def str_mul(a, B):
tl=[]
for b in B:
tl.append(a+b)
return tl
result=perm('1234')
print len(result),result
谢谢,python看不懂啊,
我在网上看到个C的,然后改成perl的,
用的递归
sub subset {
my ($a, $n, $m, $b, $M) = @_ ;
@a = @{$a} ;
@b = @{$b} ;
for ( my $i = $n; $i >= $m; $i = $i - 1 ) {
$b[$m - 1] = $i - 1 ;
if ( $m > 1 ) {
subset (\@a, $i - 1, $m - 1, \@b, $M);
} else {
my @split1 = () ;
my @split2 = () ;
for ( my $j = $M - 1; $j >= 0; $j = $j - 1 ) {
push @split1, $a[ $b[$j] ] ;
}
print @split1, "\n" ;
@split2 = grep(!defined $split1{$_}, @a);
print @split2, "\n" ;
}
}
}
$scalar_load = @load ;
print $scalar_load, "\n" ;
for ( my $i = 1; $i <= $scalar_load/ 2; $i = $i + 1 ) {
print "split $i : \n" ;
my @ss = (0) ;
subset ( \@load, $scalar_load, $i, \@ss, $i ) ;
}
这一句执行有问题,
@split2 = grep(!defined $split1{$_}, @a);
@a 是 1 2 3 4
@split1 是 2 3
@split2怎么得到 1 4 呢? 就是把@a里面的@split1元素给删掉得到的数组。