- 论坛徽章:
- 0
|
本帖最后由 mingxw 于 2011-04-07 09:33 编辑
改进一下:
- use strict;
- use warnings;
- use constant TREASUER_TYPES => 4;
- my @trea_list=(100,50,20,5);
- my $trea_num =[1, 2, 3, 1];
- sub find_share {
- my ($target,$type,$nums)=@_;
- return ([],$nums) if $target==0;
- return (undef,$nums) if $type>=TREASUER_TYPES;
- return find_share($target,$type+1,$nums) if $$nums[$type]<=0;
-
- my $first = $trea_list[$type];
- return find_share($target,$type+1,$nums) if $target < $first;
- $$nums[$type]--;
- return ([$first],$nums) if $target == $first;
- my $solution;
- ($solution,$nums) = find_share($target-$first,$type,$nums);
- return ([$first,@$solution],$nums) if $solution;
- $$nums[$type]++;
- return find_share($target,$type+1,$nums);
- }
- my $target=160;
- my $solution;
- my $i=0;
- print "\nFind $target in ",join(", ",map {$trea_list[$i++]." x ".$_} @$trea_num),"\n";
- ($solution,$trea_num) = find_share($target,0,$trea_num);
- if($solution) {
- $i=0;
- print "\nFound : ",join(", ",@$solution);
- print "\nTreasures remain: ",join(", ",map {$trea_list[$i++]." x ".$_} @$trea_num),"\n";
- }
复制代码 |
|