use strict;
use warnings;
my @list = (0, 2, 3);
for my $w (1, 2, 3, 4, 7, 8) {
print "count = $w\n";
make_sets1($w, "");
}
sub make_sets1 {
my ($weight, $temp_result) = @_;
print "$temp_result\n" and return if $weight <= 0;
for my $item (@list) {
make_sets1( $weight -1, "$temp_result$item, ");
}
}
####
$ time perl multisets.pl
count = 1
0,
2,
3,
count = 2
0, 0,
0, 2,
0, 3,
2, 0,
2, 2,
2, 3,
3, 0,
3, 2,
3, 3,
count = 3
0, 0, 0,
0, 0, 2,
0, 0, 3,
0, 2, 0,
0, 2, 2,
0, 2, 3,
0, 3, 0,
0, 3, 2,
0, 3, 3,
2, 0, 0,
2, 0, 2,
2, 0, 3,
2, 2, 0,
2, 2, 2,
2, 2, 3,
2, 3, 0,
2, 3, 2,
2, 3, 3,
3, 0, 0,
3, 0, 2,
3, 0, 3,
3, 2, 0,
3, 2, 2,
3, 2, 3,
3, 3, 0,
3, 3, 2,
3, 3, 3,
count = 4
0, 0, 0, 0,
0, 0, 0, 2,
0, 0, 0, 3,
0, 0, 2, 0,
0, 0, 2, 2,
0, 0, 2, 3,
0, 0, 3, 0,
0, 0, 3, 2,
0, 0, 3, 3,
0, 2, 0, 0,
0, 2, 0, 2,
0, 2, 0, 3,
0, 2, 2, 0,
0, 2, 2, 2,
0, 2, 2, 3,
0, 2, 3, 0,
0, 2, 3, 2,
0, 2, 3, 3,
0, 3, 0, 0,
0, 3, 0, 2,
0, 3, 0, 3,
0, 3, 2, 0,
0, 3, 2, 2,
0, 3, 2, 3,
0, 3, 3, 0,
0, 3, 3, 2,
0, 3, 3, 3,
2, 0, 0, 0,
2, 0, 0, 2,
2, 0, 0, 3,
2, 0, 2, 0,
2, 0, 2, 2,
2, 0, 2, 3,
2, 0, 3, 0,
2, 0, 3, 2,
2, 0, 3, 3,
2, 2, 0, 0,
2, 2, 0, 2,
2, 2, 0, 3,
2, 2, 2, 0,
2, 2, 2, 2,
2, 2, 2, 3,
2, 2, 3, 0,
2, 2, 3, 2,
2, 2, 3, 3,
2, 3, 0, 0,
2, 3, 0, 2,
2, 3, 0, 3,
2, 3, 2, 0,
2, 3, 2, 2,
2, 3, 2, 3,
2, 3, 3, 0,
2, 3, 3, 2,
2, 3, 3, 3,
3, 0, 0, 0,
3, 0, 0, 2,
3, 0, 0, 3,
3, 0, 2, 0,
3, 0, 2, 2,
3, 0, 2, 3,
3, 0, 3, 0,
3, 0, 3, 2,
3, 0, 3, 3,
3, 2, 0, 0,
3, 2, 0, 2,
3, 2, 0, 3,
3, 2, 2, 0,
3, 2, 2, 2,
3, 2, 2, 3,
3, 2, 3, 0,
3, 2, 3, 2,
3, 2, 3, 3,
3, 3, 0, 0,
3, 3, 0, 2,
3, 3, 0, 3,
3, 3, 2, 0,
3, 3, 2, 2,
3, 3, 2, 3,
3, 3, 3, 0,
3, 3, 3, 2,
3, 3, 3, 3,
count = 7
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 2,
0, 0, 0, 0, 0, 0, 3,
0, 0, 0, 0, 0, 2, 0,
0, 0, 0, 0, 0, 2, 2,
0, 0, 0, 0, 0, 2, 3,
0, 0, 0, 0, 0, 3, 0,
0, 0, 0, 0, 0, 3, 2,
0, 0, 0, 0, 0, 3, 3,
. . . (abbreviated)
3, 3, 3, 3, 3, 3, 0, 3,
3, 3, 3, 3, 3, 3, 2, 0,
3, 3, 3, 3, 3, 3, 2, 2,
3, 3, 3, 3, 3, 3, 2, 3,
3, 3, 3, 3, 3, 3, 3, 0,
3, 3, 3, 3, 3, 3, 3, 2,
3, 3, 3, 3, 3, 3, 3, 3,
real 0m0.141s
user 0m0.046s
sys 0m0.031s
##
##
$ time perl multisets.pl > /dev/null
real 0m0.057s
user 0m0.015s
sys 0m0.015s
##
##
count = 3
0, 0, 0,
0, 0, 2,
0, 0, 3,
0, 2, 0,
0, 2, 2,
0, 2, 3,
0, 3, 0,
0, 3, 2,
0, 3, 3,
2, 0, 0,
2, 0, 2,
2, 0, 3,
2, 2, 0,
2, 2, 2,
2, 2, 3,
2, 3, 0,
2, 3, 2,
2, 3, 3,
3, 0, 0,
3, 0, 2,
3, 0, 3,
3, 2, 0,
3, 2, 2,
3, 2, 3,
3, 3, 0,
3, 3, 2,
3, 3, 3,
##
##
count=3
3,0,0
3,0,2
3,0,3
3,2,3
3,2,2
3,3,3
0,0,2
0,0,0
0,2,2
2,2,2