免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: jzp520520
打印 上一主题 下一主题

求解不等式算法 [复制链接]

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
11 [报告]
发表于 2013-12-01 23:04 |只看该作者
回复 8# yestreenstars

那个no效率
10种尺寸,要 15 s


try: 12 s
  1. #!/usr/bin/perl
  2. my $length = 10;
  3. my @cut    = sort { $b <=> $a }
  4.   qw/2.5 2.6 1.9 3.5 2.0 4.0 4.5 5 4.7 3.2/;
  5. my ( $max, $count ) = ( $length - $cut[-1], '001' );

  6. sub try {
  7.     @_ ? map { my $h = $_; map [ $h, @$_ ], try(@_) } @{ +shift } : [];
  8. }

  9. print join( "\t", '     sum', 'rem', @cut ), $/;
  10. print $count++, '| ', join( "\t", @$_ ), $/
  11.   for sort { $b->[0] <=> $a->[0] } map {
  12.     my ( $gimme, $sum, $i ) = $_;
  13.     for (@$gimme) {
  14.         $sum += $cut[ $i++ ] * $_;
  15.         last if $sum > $length;
  16.     }
  17.     $max < $sum && $sum <= $length
  18.       ? [ sprintf( "%.1f", $sum ), sprintf( "%.2f", $length - $sum ), @$gimme ]
  19.       : ()
  20.   } try map [ 0 .. $length / $_ ], @cut;
复制代码
try2: 8s
  1. #!/usr/bin/perl
  2. my $length = 10;
  3. my @cut    = sort { $b <=> $a }
  4.   qw/2.5 2.6 1.9 3.5 2.0 4.0 4.5 5 4.7 3.2/;
  5. my ( $max, $count ) = ( $length - $cut[-1], '001' );

  6. sub try2 {
  7.     map [ split /\|/ ],
  8.       glob '{' . join( '}{', map join( '|,', @$_ ) . '|', @_ ) . '}';
  9. }

  10. print join( "\t", '     sum', 'rem', @cut ), $/;
  11. print $count++, '| ', join( "\t", @$_ ), $/
  12.   for sort { $b->[0] <=> $a->[0] } map {
  13.     my ( $gimme, $sum, $i ) = $_;
  14.     for (@$gimme) {
  15.         $sum += $cut[ $i++ ] * $_;
  16.         last if $sum > $length;
  17.     }
  18.     $max < $sum && $sum <= $length
  19.       ? [ sprintf( "%.1f", $sum ), sprintf( "%.2f", $length - $sum ), @$gimme ]
  20.       : ()
  21.   } try2 map [ 0 .. $length / $_ ], @cut;
复制代码
try3: 8s
  1. #!/usr/bin/perl
  2. my $length = 10;
  3. my @cut    = sort { $b <=> $a }
  4.   qw/2.5 2.6 1.9 3.5 2.0 4.0 4.5 5 4.7 3.2/;
  5. my ( $max, $count, @choice ) = ( $length - $cut[-1], '001' );

  6. sub try3 {
  7.     my ( $check, $t, @A ) = ( 1, 1, @_ );
  8.     my @elem = map { $check *= @$_; scalar @$_ } @A;
  9.     my @M = reverse 1, map $t = $t * $elem[ -$_ ], 1 .. $#elem;
  10.     sub {
  11.         return unless $check--;
  12.         [ map $A[$_][ $check / $M[$_] % $elem[$_] ], 0 .. $#elem ];
  13.     };
  14. }

  15. my $gimme = try3 map [ 0 .. $length / $_ ], @cut;

  16. while ( my $try = $gimme->() ) {
  17.     my ( $sum, $i );
  18.     for (@$try) {
  19.         $sum += $cut[ $i++ ] * $_;
  20.         last if $sum > $length;
  21.     }
  22.     next if $sum > $length or $sum <= $max;
  23.     push @choice,
  24.       [ sprintf( "%.1f", $sum ), sprintf( "%.2f", $length - $sum ), @$try ];
  25. }

  26. print join( "\t", '     sum', 'rem', @cut ), $/;
  27. print $count++, '| ', join( "\t", @$_ ), $/
  28.   for sort { $b->[0] <=> $a->[0] } @choice;
复制代码

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
12 [报告]
发表于 2013-12-01 23:14 |只看该作者
回复 7# 104359176


    大牛,有 any 调优 de idea?.

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
13 [报告]
发表于 2013-12-01 23:17 |只看该作者
回复 10# jzp520520
  1. my $a = [ 1, 2, 3 ];
  2. my @a = @$a;
  3. say @a;   # 123
复制代码

论坛徽章:
0
14 [报告]
发表于 2013-12-01 23:22 |只看该作者
看不懂。。。但是感觉蛮高深的
rubyish 发表于 2013-11-29 00:30
No Optimization!
看看:

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
15 [报告]
发表于 2013-12-01 23:25 |只看该作者
回复 14# 大众推荐

大牛,有 any 调优 de idea?.
   

论坛徽章:
0
16 [报告]
发表于 2013-12-02 00:26 |只看该作者
本帖最后由 cujeson 于 2013-12-02 00:29 编辑

回复 3# rubyish


大神,请教一下这行代码:
@_ ? map { my $h = $_; map [ $h, @$_ ], try(@_) } @{ +shift } : [];
以下是我的疑问:
1.第一个黄色区域@_判断的是什么?数组长度?数组是否存在?数组是否为空?
2.第二个黄色区域map [ $h, @$_ ], try(@_),这嵌套看起来有点晕,这map函数返回值是什么啊?
3.第二个黄色区域@{ +shift }这是从@_的左边取出一个元素来创建数组的意思吗?
4.第三个黄色区域[]表示什么?
5.还有一个问题就是下面也出现一个类似的(),这是返回空列表的意思吗?

问题比较多,感谢大神不吝赐教!

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
17 [报告]
发表于 2013-12-02 03:32 |只看该作者
回复 16# cujeson
  1. sub try {
  2.     return [] if @_ == 0;
  3.     my $a = shift;
  4.     my @R =
  5.       map {
  6.         my $h = $_;
  7.         print "-> $h ";
  8.         map { [ $h, @$_ ] } try(@_)
  9.       } @$a;
  10.     say "$/\@a = @$a  return =";
  11.     say "\t@$_ " for @R;
  12.     @R;
  13. }

  14. try [qw/A B/], [qw/x y/], [qw/1 2 3 4/];
复制代码
output:
  1. -> A -> x -> 1 -> 2 -> 3 -> 4
  2. @a = 1 2 3 4  return =
  3.         1
  4.         2
  5.         3
  6.         4
  7. -> y -> 1 -> 2 -> 3 -> 4
  8. @a = 1 2 3 4  return =
  9.         1
  10.         2
  11.         3
  12.         4

  13. @a = x y  return =
  14.         x 1
  15.         x 2
  16.         x 3
  17.         x 4
  18.         y 1
  19.         y 2
  20.         y 3
  21.         y 4
  22. -> B -> x -> 1 -> 2 -> 3 -> 4
  23. @a = 1 2 3 4  return =
  24.         1
  25.         2
  26.         3
  27.         4
  28. -> y -> 1 -> 2 -> 3 -> 4
  29. @a = 1 2 3 4  return =
  30.         1
  31.         2
  32.         3
  33.         4

  34. @a = x y  return =
  35.         x 1
  36.         x 2
  37.         x 3
  38.         x 4
  39.         y 1
  40.         y 2
  41.         y 3
  42.         y 4

  43. @a = A B  return =
  44.         A x 1
  45.         A x 2
  46.         A x 3
  47.         A x 4
  48.         A y 1
  49.         A y 2
  50.         A y 3
  51.         A y 4
  52.         B x 1
  53.         B x 2
  54.         B x 3
  55.         B x 4
  56.         B y 1
  57.         B y 2
  58.         B y 3
  59.         B y 4
复制代码
in last element [1, 2, 3, 4]
map { my $h = $_; map [ $h, @$_ ], try(@_) } 1, 2, 3, 4
now @_ is empty so sub return []
[ $h, @$_ ] => [ $h, @{ [] } ] => [ $h ] -> [1]
[1]
[2]
[3]
[4]

in [x, y]
map [ $h, @$_ ], [1], [2], [3], [4]
[ $h, @$_ ] => [ x, @{ [1] } ] =>
[x, 1]
[x, 2]
[x, 3]
[x, 4]
....
[y, 4]

in [A, B]
map [ $h, @$_ ], [x, 1],[x, 2] ... [y, 4]
[ $h, @$_ ] => [ A, @{ [x, 1] } ] =>
[A, x, 1]
[A, x, 2]
...
[A, y, 4]
[B, x, 1]
....
[B, y, 4]

论坛徽章:
0
18 [报告]
发表于 2013-12-02 12:24 |只看该作者
亲,我是真心看不懂并真心认为很高深,反正我看到带@ $ 等编程,包括shell,就头晕,就真心觉得你们牛X,因为我觉得精神稍微不集中,就会犯错。。。
rubyish 发表于 2013-12-01 23:25
回复 14# 大众推荐

大牛,有 any 调优 de idea?.

论坛徽章:
0
19 [报告]
发表于 2013-12-02 13:15 |只看该作者
回复 17# rubyish


return [] 是不是相当于return undef;


   

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
20 [报告]
发表于 2013-12-02 14:06 |只看该作者
回复 11# rubyish


would you like this

$ cat cut.pl
#!/usr/bin/perl

use strict;
use warnings;

while(<DATA>){
  chomp;
  next if(m/^\s*#/);
  next if(m/^\s*$/);
  
  my($sTotal, @aCut) = split;
  get_cut($sTotal, @aCut);
}

sub get_cut{
  my($sTotal, @aCut) = @_;
  our @aAns = ();
  our $sCnt = 0;
  my $sMin = $aCut[0];
  for(@aCut){$sMin = $_ if($sMin > $_)};

  print "Total Length= $sTotal, Min = $sMin\n";
  printf("%4s","");
  printf(" %5.2f", $_) foreach(@aCut);
  printf(" %5s %5s\n", "Sum", "Rem");

  _cut($sTotal, 0, $sMin, \@aCut, (0) x scalar(@aCut));

  printf("%4s","");
  printf(" %5.2f", $_) foreach(@aCut);
  printf(" %5s %5s\n", "Sum", "Rem");
  print "Total length = $sTotal, Min = $sMin\n";
  print "Total count = $sCnt\n\n";

  sub _cut{
    my($sTotal, $sOffset, $sMin, $raCut, @aNum) = @_;
    my $sSum = 0;
    $sSum += $aNum[$_] * $raCut->[$_]   for (0 .. (scalar @aNum -1));
    my $sDiff = sprintf("%.2f",$sTotal - $sSum);
    return if($sDiff < 0);
    if($sOffset >= scalar @aNum ){
      if(0 <= $sDiff && $sDiff < $sMin){
        printf("x%03d", ++$sCnt);
        printf(" %5d", $_) foreach(@aNum);
        printf(" %5.2f %5.2f\n", $sSum, $sDiff);
            push @aAns, [@aNum];
          }
      return
        }
    foreach (0 .. int($sTotal/$raCut->[$sOffset])){
      $aNum[$sOffset] = $_;
      _cut($sTotal, $sOffset+1, $sMin, $raCut, @aNum);
        }
  }
}

__DATA__
10 2.5 2.6 1.0 1.1
10 2.5 2.6 1.9 3.5 2.0 4.0 4.5 5 4.7 3.2


  1. $ time perl cut.pl
  2. Total Length= 10, Min = 1.9
  3.       2.50  2.60  1.90  3.50  2.00  4.00  4.50  5.00  4.70  3.20   Sum   Rem
  4. x001     0     0     0     0     0     0     0     0     0     3  9.60  0.40
  5. x002     0     0     0     0     0     0     0     0     2     0  9.40  0.60
  6. ...
  7. x135     3     0     0     0     1     0     0     0     0     0  9.50  0.50
  8. x136     3     0     1     0     0     0     0     0     0     0  9.40  0.60
  9. x137     4     0     0     0     0     0     0     0     0     0 10.00  0.00
  10.       2.50  2.60  1.90  3.50  2.00  4.00  4.50  5.00  4.70  3.20   Sum   Rem
  11. Total length = 10, Min = 1.9
  12. Total count = 137
复制代码

real    0m0.324s
user    0m0.004s
sys    0m0.128s





您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP