我想 的头都大了,求救啊,高手!
有一个工程,工程中需要有长度为L1的钢材N1根,长度为L2的钢材N2根,……长度为LK的钢材NK根。钢材每切割一次,将会有长度为DL的损耗。
现有长度为L的钢材,怎样切割使得钢材损耗最少。
其中L为定长,比如:6000mm
L1,L2,L3,……LK 都小于L,有可能 > L/2
N1,N2,N3,……NK 为正整数 >0
要求 使得最后剩余的钢材尽可能为0 ,不能则要求最小,
最后显示出 每根长度为L钢材的 切割结果,如 L1,N根,L2,N根,………等等,
以及利用率!谢了谢了谢了

解决方案 »

  1.   

    http://expert.csdn.net/Expert/topic/2412/2412620.xml?temp=.6908533
      

  2.   


      不会是数学建模之类的吧?看看<运筹学>!
      

  3.   

    高难度,就是装箱子问题
    up关注ing
      

  4.   

    http://club.excelhome.net/dispbbs.asp?BoardID=2&replyID=18337&id=16546&star=1&skin=0
      

  5.   

    program gangcai;
    const inputfile='input.txt';
         outputfile='output.txt';
         maxn=1000;
         maxl=10000;
    var L     :  array[0..maxn]of longint;
        n     :  array[1..maxn]of word;
        m     :  integer; 
        DL    :  longint;    can   :  array[0..maxl]of boolean;
        dd    :  array[0..maxl,1..maxn]of word;procedure init;
    var i     :  integer;
    begin
      assign(input,inputfile);    reset(input);
      readln(L[0]);
      readln(DL);
      readln(m);
      for i:=1 to m do
        readln(L[i],n[i]);
      close(input);
    end;procedure order(low,high: integer);
    var i,j     :  integer;
        p,x     :  longint;
    begin
      if low>=high then exit;
      i:=low;   j:=high;
      p:=L[(i+j)div 2];
      repeat
        while L[i]>p do inc(i);
        while L[j]<p do dec(j);
        if i<=j then begin
          x:=L[i];   L[i]:=L[j];  L[j]:=x;
          x:=n[i];   n[i]:=n[j];  n[j]:=x;
          inc(i);
          dec(j);
        end;
      until i>=j;
      order(low,j);
      order(i,high);
    end;procedure main;
    var i,j,k            :  longint;
        total,Lall,Nall  :  longint;
        yx,sh,sy         :  longint;
    begin
      for i:=0 to m do inc(L[i],DL);
      order(1,m);  total:=0;
      assign(output,outputfile);   rewrite(output);
      repeat
        inc(total);    fillchar(can,sizeof(can),false);
        fillchar(dd,sizeof(dd),0);
        can[0]:=true;    for i:=1 to m do
          for j:=1 to n[i] do
            for k:=L[0]-L[i] downto 0 do
              if(can[k])and(can[k+L[i]]=false)then begin
                can[k+L[i]]:=true;
                dd[k+L[i]]:=dd[k];
                inc(dd[k+L[i],i]);
              end;
        for k:=L[0] downto 0 do if can[k] then break;    if k>0 then begin
          writeln('The[',total,']:');
          writeln('   Long:         Number:');
          Lall:=0;
          Nall:=0;
          for i:=1 to m do
            if dd[k,i]>0 then begin
              writeln(L[i]-DL:7,'           ',dd[k,i]:5);
              inc(Lall,L[i]*dd[k,i]);
              inc(Nall,dd[k,i]);
              dec(n[i],dd[k,i]);
            end;      yx:=Lall-Nall*DL;
          if Lall=L[0] then sh:=(Nall-1)*DL
          else sh:=Nall*DL;
          sy:=L[0]-DL-yx-sh;
          if sy<0 then begin
            inc(sh,sy);
            sy:=0;
          end;
          writeln('you xiao chang du: ',yx);
          writeln('sun hao:           ',sh);
          writeln('shen yu chang du:  ',sy);
          writeln('li yong lv:        ',yx/(L[0]-Dl):0:4);
          writeln;
        end;
      until k=0;  writeln;
      writeln('Total: ',total-1);
      close(output);
    end;begin
      init;
      main;
    end.这是一个free pascal的程序
      

  6.   

    谁能帮忙改为java、或vc或vb的语言啊, pascal我不会啊
      

  7.   

    哈哈!up 是up 可要解决啊