Kevin_qing(Kevin)您能具体一点,或者说出公式吗?

解决方案 »

  1.   

    我没有详细思考,但有一想法:
    以各板边长排序 -> 首尾相加(尾部指针由尾向首扫描),取最佳组合 -> 截选出此组合,放入另一队列
                                 |___________________________________|有点类似快速排序的思维方式,希望有用。
      

  2.   

    昨晚我想了一个,穷举法,不过,可能只能得到比较优的解。思路:
    把原料分为上下两个部分,上半部分,先横向放再纵向放,下半部分先纵向再横向放。(相当于四个部分,每一部分都从0循环到最大可放数,穷举所有组合。)有很大的漏洞:就是我把上下两部分独立开来算,其实有时候上下的剩料合可能也能截出一块来。(什么情况会出现,我还没找到)你改进一下吧。const
      W=250;
      H=120;implementation{$R *.DFM}function sss(x,y:integer):integer;
    var i,j,k,max,n1,n2:integer;
    begin
      max:=0;
      for i:=0 to W div x do
      begin
        for j:=0 to H div y do
        begin
          n1:=i*j+(j*y) div x *(W-i*x) div y;
          for k:=0 to W div y do
          begin
            n2:=(H-j*y) div x *k+(W-k*y) div x * (H-j*y) div y;
    //  n1是上半部分的块数,n2是下半部分的块数
            if (n1+n2)>max then
              max:=n1+n2;
          end;
        end;
      end;
      result:=max;
    end;