- 论坛徽章:
- 0
|
数字相加情况。
原帖由 "zhkun" 发表:
我想若将条件修改一下,大家看看这样行不行。
设置最大值,每个数字只能相加一次,不设置最小值,求最少加式(可以把没有相加的数字放到最后一组中)。
此题有点问题。 如我前面所讲, 无唯一解,所有我全列出了结果。
这次用 perl. 另外, 修改 $MINLEN, 可限制最少加项的数目。
- #!/bin/perl
- $MAX=150;
- $MINLEN=1;
- $min=9;
- open DATA, "<$ARGV[0]" or die "Can't open $ARGV[0]: $!";
- while (<DATA>) {
- chomp;
- @data=(@data, $_);
- }
- @data=sort { $a <=> $b } @data;
- sub getall {
- my $i=$_[2];
- for ( $i; $i >= 0; $i -- ) {
- my $sum=$_[1];
- my $list="$_[0]" . ($_[0] ? " + " : "") . "$data[$i]";
- $sum += $data[$i];
- if ( $sum <= $MAX ) {
- my $list1 = $list . " = " . $sum ;
- @str=split /\D+/, $list;
- $len=$#str + 1;
- if ( $len <= $min && $len >= $MINLEN ) {
- $min = $len;
- $store{$list1}=$len;
- @used=(@used, split /\s+/, $list);
- }
- }
- &getall( $list, $sum, $i - 1);
- }
- }
- &getall( "", 0, $#data) ;
- foreach $key ( sort { $a <=> $b} keys %store ) {
- print "$key\n";
- }
- print "\nUnused number\n\n";
- foreach (@used) {
- $u{$_}=$_;
- }
- for ( $i=0; $i <= $#data; $i++ ) {
- print "$data[$i]\n" if ( ! exists $u{$data[$i]} );
- }
复制代码
- $MINLEN=1 时的结果:
- # ./1 data
- 1 = 1
- 2 = 2
- 3 = 3
- 4 = 4
- 12 = 12
- 24 = 24
- 32 = 32
- 45 = 45
- 53 = 53
- 97 = 97
- 100 = 100
- 145 = 145
- 150 = 150
- Unused number
- 170
复制代码
|
|