- 論壇徽章:
- 7
|
回復(fù) 8# yestreenstars
那個no效率 
10種尺寸,要 15 s
try: 12 s  - #!/usr/bin/perl
- my $length = 10;
- my @cut = sort { $b <=> $a }
- qw/2.5 2.6 1.9 3.5 2.0 4.0 4.5 5 4.7 3.2/;
- my ( $max, $count ) = ( $length - $cut[-1], '001' );
- sub try {
- @_ ? map { my $h = $_; map [ $h, @$_ ], try(@_) } @{ +shift } : [];
- }
- print join( "\t", ' sum', 'rem', @cut ), $/;
- print $count++, '| ', join( "\t", @$_ ), $/
- for sort { $b->[0] <=> $a->[0] } map {
- my ( $gimme, $sum, $i ) = $_;
- for (@$gimme) {
- $sum += $cut[ $i++ ] * $_;
- last if $sum > $length;
- }
- $max < $sum && $sum <= $length
- ? [ sprintf( "%.1f", $sum ), sprintf( "%.2f", $length - $sum ), @$gimme ]
- : ()
- } try map [ 0 .. $length / $_ ], @cut;
復(fù)制代碼 try2: 8s  - #!/usr/bin/perl
- my $length = 10;
- my @cut = sort { $b <=> $a }
- qw/2.5 2.6 1.9 3.5 2.0 4.0 4.5 5 4.7 3.2/;
- my ( $max, $count ) = ( $length - $cut[-1], '001' );
- sub try2 {
- map [ split /\|/ ],
- glob '{' . join( '}{', map join( '|,', @$_ ) . '|', @_ ) . '}';
- }
- print join( "\t", ' sum', 'rem', @cut ), $/;
- print $count++, '| ', join( "\t", @$_ ), $/
- for sort { $b->[0] <=> $a->[0] } map {
- my ( $gimme, $sum, $i ) = $_;
- for (@$gimme) {
- $sum += $cut[ $i++ ] * $_;
- last if $sum > $length;
- }
- $max < $sum && $sum <= $length
- ? [ sprintf( "%.1f", $sum ), sprintf( "%.2f", $length - $sum ), @$gimme ]
- : ()
- } try2 map [ 0 .. $length / $_ ], @cut;
復(fù)制代碼 try3: 8s  - #!/usr/bin/perl
- my $length = 10;
- my @cut = sort { $b <=> $a }
- qw/2.5 2.6 1.9 3.5 2.0 4.0 4.5 5 4.7 3.2/;
- my ( $max, $count, @choice ) = ( $length - $cut[-1], '001' );
- sub try3 {
- my ( $check, $t, @A ) = ( 1, 1, @_ );
- my @elem = map { $check *= @$_; scalar @$_ } @A;
- my @M = reverse 1, map $t = $t * $elem[ -$_ ], 1 .. $#elem;
- sub {
- return unless $check--;
- [ map $A[$_][ $check / $M[$_] % $elem[$_] ], 0 .. $#elem ];
- };
- }
- my $gimme = try3 map [ 0 .. $length / $_ ], @cut;
- while ( my $try = $gimme->() ) {
- my ( $sum, $i );
- for (@$try) {
- $sum += $cut[ $i++ ] * $_;
- last if $sum > $length;
- }
- next if $sum > $length or $sum <= $max;
- push @choice,
- [ sprintf( "%.1f", $sum ), sprintf( "%.2f", $length - $sum ), @$try ];
- }
- print join( "\t", ' sum', 'rem', @cut ), $/;
- print $count++, '| ', join( "\t", @$_ ), $/
- for sort { $b->[0] <=> $a->[0] } @choice;
復(fù)制代碼 |
|