#! perl -slw use strict; use Data::Dump qw[ pp ]; use Algorithm::Combinatorics qw[ variations variations_with_repetition ]; use List::Util qw[ sum ]; my %objects = map{ shift @$_ => $_ } map[ split ], ; pp \%objects; my $iter = variations( [ keys %objects ], 3 ); my( $bestValue, @bestSet ) = 0; while( my $set = $iter->next ) { my $cost = sum( map{ $objects{ $_ }[0] } @$set ); if( $cost <= 25 ) { my $value = sum( map{ $objects{ $_ }[ 1 ] } @$set ); if( $value >= $bestValue ) { $bestValue = $value; @bestSet = @$set; print "[@$set] => cost:$cost value:$value"; } } } print "Best: @bestSet => $bestValue"; #object cost($) value __DATA__ A 6 16 B 7 14 C 8 19 D 8 17 E 10 20 #### C:\test>1147022.pl { A => [6, 16], B => [7, 14], C => [8, 19], D => [8, 17], E => [10, 20] } [A D C] => cost:22 value:52 [A D E] => cost:24 value:53 [A C E] => cost:24 value:55 [A E C] => cost:24 value:55 [C A E] => cost:24 value:55 [C E A] => cost:24 value:55 [E A C] => cost:24 value:55 [E C A] => cost:24 value:55 Best: E C A => 55 #### C:\test>1147022.pl { A => [6, 16], B => [7, 14], C => [8, 19], D => [8, 17], E => [10, 20] } [A A A] => cost:18 value:48 [A A D] => cost:20 value:49 [A A C] => cost:20 value:51 [A A E] => cost:22 value:52 [A D C] => cost:22 value:52 [A D E] => cost:24 value:53 [A C C] => cost:22 value:54 [A C E] => cost:24 value:55 [A E C] => cost:24 value:55 [D C C] => cost:24 value:55 [C A E] => cost:24 value:55 [C D C] => cost:24 value:55 [C C D] => cost:24 value:55 [C C C] => cost:24 value:57 Best: C C C => 57