我想 的头都大了,求救啊,高手!
有一个工程,工程中需要有长度为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根,………等等,
以及利用率!谢了谢了谢了
有一个工程,工程中需要有长度为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根,………等等,
以及利用率!谢了谢了谢了
不会是数学建模之类的吧?看看<运筹学>!
up关注ing
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的程序