求救VB中能实现这个算法么?

quanquan626 2003-12-07 09:42:30
我想 的头都大了,求救啊,高手!
有一个工程,工程中需要有长度为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根,………等等,
以及利用率!

谢了谢了谢了

...全文
75 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
quanquan626 2003-12-11
  • 打赏
  • 举报
回复
up 解决啊!
kimurakenshin 2003-12-10
  • 打赏
  • 举报
回复
帮你up up
wiwian6143 2003-12-10
  • 打赏
  • 举报
回复
a啊没有人理我!
quanquan626 2003-12-10
  • 打赏
  • 举报
回复
哈哈!up 是up 可要解决啊
quanquan626 2003-12-08
  • 打赏
  • 举报
回复
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的程序

quanquan626 2003-12-08
  • 打赏
  • 举报
回复
帮帮忙啊!
flyingscv 2003-12-08
  • 打赏
  • 举报
回复
应该比装箱简单
用遍历就好了
其它未必有最优算法
quanquan626 2003-12-08
  • 打赏
  • 举报
回复
谁能帮忙改为java、或vc或vb的语言啊, pascal我不会啊
progame 2003-12-07
  • 打赏
  • 举报
回复
感觉有点相当于装箱算法
yxgsb 2003-12-07
  • 打赏
  • 举报
回复
学习ing
quanquan626 2003-12-07
  • 打赏
  • 举报
回复
这个里面也没有具体的解体步骤啊。。。。
hhjjhjhj 2003-12-07
  • 打赏
  • 举报
回复
http://club.excelhome.net/dispbbs.asp?BoardID=2&replyID=18337&id=16546&star=1&skin=0
xiaomai1983816 2003-12-07
  • 打赏
  • 举报
回复
我想是装箱算法
请提问者试试装箱算法
应该没问题的!!!!
quanquan626 2003-12-07
  • 打赏
  • 举报
回复
写了半天,就是不对啊, 我只是线形切割优化啊,
  • 打赏
  • 举报
回复
高难度,就是装箱子问题


up

关注ing
simanh 2003-12-07
  • 打赏
  • 举报
回复
up
quanquan626 2003-12-07
  • 打赏
  • 举报
回复
我只是想知道怎么解。。。。。。
doudou8090 2003-12-07
  • 打赏
  • 举报
回复
不会是装机装箱吧
longki 2003-12-07
  • 打赏
  • 举报
回复

不会是数学建模之类的吧?看看<运筹学>!
jpinglee 2003-12-07
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2412/2412620.xml?temp=.6908533
加载更多回复(1)

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧