计算问题。。。请大家帮个忙!!!(真的没分了,迁就一下) (100分)

  • 主题发起人 主题发起人 千年飞鸟
  • 开始时间 开始时间

千年飞鸟

Unregistered / Unconfirmed
GUEST, unregistred user!
有一条方程列出来。。现在想问一下大家。。。代码应该怎么写好?
下列方程只有X,Y两个未知数,其它都知已知数!
X*L/a*H+Y*L/b*H

现在设X+Y的值为W/b,且(X大于或等于Y)
想用代入循环法(因为W/b的值一般不会太大)
例如若W/b=5的 则会有 X=3,Y=2 X=4,Y=1 X=5,Y=0
若W/b=6的 则会有 X=3,Y=3 X=4,Y=2 X=5,Y=1 X=6,Y=0
将各数字代入最上面的方程做比较,然后取最大的数为答案,
请问各位。。。代码怎样写呢?
 
是整数规划,找本书看看。
 
为什么不干脆把方程写成X*L/a*H+(W/b-X)*L/b*H?
 
raymondcen兄这样说的也行!!但代码怎样写呢?还要比较的啊!
我这方程是集装箱摆电视机用的,(L,W,H的箱的长宽高,a,b,H是电视机的长宽高)
假设是,X是横摆多少台,Y是竖摆多少台!因为我要求一个最优化的方案!
请你们帮个忙!!~~代码怎么写?
 
呵呵,上次也是你问的集装箱的问题:)
只有一个X就简单了吧!
for X := 1 to W/b do
一个一个比较,选择一个最大(或者最小)的,同时把最大时候的X的值保存起来就行了。
 
不是for X := 1 to W/b do
应该是for X := 1 to 允许的最大值 do
 
现在不是求出X的最大值,而要用X代入方程,求出方程的最大值,作比较啊?!

而且要算出横和竖要摆多少台就必须设X和Y啊,因为两个数我都要显示出来!

raymondcen兄能再说详细点吗??我是新手。。所以真的太多地方不明白了!
 
W/b的值是不是已知的?
方程初始值Max := 0
把X:= 1 到 X := W/b一个一个代入方程,每一次的结果去跟Max比较
因为X一定小于W/b
for X := 1 to W/b do
begin
re := X*L/a*H+(W/b-X)*L/b*H;
if re > Max then
begin
max := re;
maxX := X;
end;
end;
循环结束以后,Max就是方程的最大值,即最多能放多少台。
MaxX就是当能放最多的情况下,应该横着放多少台。
W/b-MaxX就是应该竖着放多少台。
 
我刚才是这样写的``刚运行不了~~麻烦raymondcen兄看看那里出错了!!

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer; re:integer;
a:integer;
b:integer;
c:integer;
x:integer;
L:integer;
W:integer;
H:integer;
begin
a:=strtoint(edit1.text);
b:=strtoint(edit2.text);
c:=strtoint(edit3.Text);
L:=strtoint(edit4.Text);
W:=strtoint(edit5.text);
H:=strtoint(edit6.Text);
for X:=1 to W/b do
begin
re:=X*L/a*H+(W/b-X)*L/b*H;
if re>Max then
begin
max:=re;
maxX:=X;
end;
end;
edit7.text:=inttostr(re);
edit8.text:=inttostr(x);
end;
end.
 
定义max: integer和maxX integer两个变量
把max和maxX初始化为0。
 
max和maxX 的初始化为0在那里设呢!??
还有刚刚程序出现的错误是这样的:
[Error] Unit1.pas(55): Incompatible types: 'Integer' and 'Extended'
[Error] Unit1.pas(57): Incompatible types: 'Integer' and 'Extended'
 
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer; re:integer;
a:integer;
b:integer;
c:integer;
x:integer;
L:integer;
W:integer;
H:integer;
//添加
max:integer;
maxX:integer;
begin
a:=strtoint(edit1.text);
b:=strtoint(edit2.text);
c:=strtoint(edit3.Text);
L:=strtoint(edit4.Text);
W:=strtoint(edit5.text);
H:=strtoint(edit6.Text);
//添加
max:=0;
maxX:=0;

for X:=1 to W/b do
begin
re:=X*L/a*H+(W/b-X)*L/b*H;
if re>Max then
begin
max:=re;
maxX:=X;
end;
end;
//修改
edit7.text:=inttostr(max);
edit8.text:=inttostr(maxX);

end;
end.
 
用这段代码试试看
 
首先感谢raymondcen兄的虚心指导!
上面那段代码我试过了,出现错误仍然是:
[Error] Unit1.pas(55): Incompatible types: 'Integer' and 'Extended'
[Error] Unit1.pas(57): Incompatible types: 'Integer' and 'Extended'

这时光标移动在for X:=1 to W/b do上面!
 
明白了。W/b没有取整。
我疏忽了。
代码改一下:
for X:=1 to Floor(W/b) do
begin
re:=X*Floor(L/a)*H+(Floor(W/b)-X)*Floor(L/b)*H;
不过我怀疑你的算法是不是对。
研究中。。。
 
怀疑方程式有问题的
 
噢。。那没关系。。我再想想吧!

把分给你!!
 
其实也运行不了~说[Error] Unit1.pas(63): Undeclared identifier: 'Floor'
 
不好意思,在uses下面多添加一个Math。
raymond@bleum.com
新贴发不出来
 
另外发了几个实际装箱数据给你!!
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部