我的代码在前几次迭代中有效,但经过几次 while 循环后,似乎我的数组元素被删除了。
我从输入参数构造的数组中取出数字,我只能说,当我得到一个传入两次的数字时,我得到一个错误。
我这样称呼我的脚本
./branchandboundNoComments.pl 1 2 3 4 5 5 7 7 9 9 10 10 12 14 19
我应该把它作为输出
0, 7, 9, 10, 14, 19
这是我的脚本
#!/usr/bin/perl -w
use strict;
my @input = @ARGV;
my $maxAll = $input[-1];
$#input = $#input - 1;
my @multiset = ( 0, $maxAll );
my @stack;
my $rotation = 0; # this is 0,1, or 2.
while ( @input != 0 ) {
my $max = $input[-1];
my @deltamultiset;
for ( my $i = 1; $i <= $#multiset; $i++ ) {
push @deltamultiset, $multiset[$i] - $max;
}
push @deltamultiset, $max;
my @deltamultiset2;
for ( my $i = 1; $i <= $#multiset; $i++ ) {
push @deltamultiset2, $multiset[$i] - ( $maxAll - $max );
}
push @deltamultiset2, $max;
if ( subset( \@deltamultiset, \@input ) and $rotation == 0 ) {
for ( my $i = 0; $i < $#deltamultiset; $i++ ) {
pop @input;
}
push @multiset, $max;
push @stack, $max;
push @stack, 0;
}
elsif ( subset( \@deltamultiset2, \@input ) and $rotation <= 1 ) {
for ( my $j = 0; $j < $#deltamultiset; $j++ ) {
pop @input;
}
push @multiset, ( $maxAll - $max );
push @stack, ( $maxAll - $max );
push @stack, 1;
$rotation = 0;
}
elsif ( @stack != 0 ) {
$rotation = $stack[-1];
$#stack--;
$max = $stack[-1];
$#stack--;
$rotation++;
for ( my $i = 0; $i < $#multiset; $i++ ) {
if ( $multiset[$i] == $max ) {
delete $multiset[$i];
last;
}
}
for ( my $i = 0; $i < $#deltamultiset; $i++ ) {
push @input, $deltamultiset[$i];
}
}
else {
print "no solutions \n";
exit;
}
}
print "@multiset is a solution \n";
sub subset {
my ( $deltamultisetSubref, $multisetSubref ) = @_;
my @deltamultisetSub = @{$deltamultisetSubref};
my @multisetSub = @{$multisetSubref};
while ( @deltamultisetSub != 0 ) {
for ( my $i = $#multisetSub; $i >= -1; $i-- ) {
if ( $multisetSub[$i] == $deltamultisetSub[-1] ) {
pop @deltamultisetSub;
$#multisetSub--;
last;
}
if ( $i == -1 ) {
return 0;
}
}
}
return 1;
}
这就是输出
Use of uninitialized value in subtraction (-) at ./branchandboundNoComments.pl line 20.
Use of uninitialized value in subtraction (-) at ./branchandboundNoComments.pl line 26.
no solutions