求个算法: ( 积分: 100 )

  • 主题发起人 主题发起人 yuzg
  • 开始时间 开始时间
Y

yuzg

Unregistered / Unconfirmed
GUEST, unregistred user!
求个算法:
一个大长方型能最多放几个小长方型,两个长方型大小都不确定的
 
求个算法:
一个大长方型能最多放几个小长方型,两个长方型大小都不确定的
 
晕。。。
 
阿凡提的算法,如果小长方形是大长方形的一半大小,那么可以放两个,如果是四分之一大小,那么可以放四个。。。。
 
挺有难度的
 
问题就是他什么都不固定.
 
用动态规划可以
代码你先等一下
 
Program CountOblong;
Var a,b,c,d:LongInt;
Function Smaller(X,Y:LongInt):LongInt;
begin
if X>Y then
Smaller:=Y
else
Smaller:=X;
end;
Function Bigger(X,Y:LongInt):LongInt;
begin
if X>Y then
Bigger:=X
else
Bigger:=Y;
end;
Function GetOblong(W1,H1,W2,h2:LongInt):LongInt;
Var Ans,Temp:LongInt;
begin
Ans:=0;
if (W1>=W2) and (H1>=H2) then
begin
Ans:=1+GetOblong(Smaller(W1-W2,H1-H2),Bigger(W1-W2,H1-H2),W2,H2)+
GetOblong(Smaller(w1-w2,h1),Bigger(W1-w2,h1),w2,h2);
temp:=1+GetOblong(Smaller(w1-w2,h1-h2),Bigger(w1-w2,h1-h2),w2,h2)+
GetOblong(Smaller(w1,h1-h2),Bigger(w1,h1-h2),w2,h2);
if temp>Ans then
Ans:=temp;
end;
if (W1>=H2) and (h1>=w2) then
begin
temp:=1+GetOblong(Smaller(W1-h2,H1-w2),Bigger(W1-h2,H1-w2),W2,H2)+
GetOblong(Smaller(w1-h2,h1),Bigger(W1-h2,h1),w2,h2);
if temp>Ans then
Ans:=temp;
temp:=1+GetOblong(Smaller(w1-h2,h1-w2),Bigger(w1-h2,h1-w2),w2,h2)+
GetOblong(Smaller(w1,h1-w2),Bigger(w1,h1-w2),w2,h2);
if temp>Ans then
Ans:=temp;
end;
GetOblong:=Ans;
end;
begin
Writeln('Input the Width and Height of the two oblongs:');
readln(a,b,c,d);
Writeln(GetOblong(Smaller(a,b),Bigger(a,b),Smaller(c,d),Bigger(c,d)));
end.
 
代码我没有用动态规划,自己改写,这个效率海行
该成动态规划,空间太大
我解释一下
Function GetOblong(大长方形宽,大长方形长,小长方形宽,小长方形长:LongInt):LongInt;
自己用吧
给分哦
 
两个长方型大小都不确定,那总得有点限制吧,要不然,小长方形越小放得不就越多嘛.
如果有限制的话,可以用运筹学的目标规划求解.
 
是运筹学的动态规划问题
 
接受答案了.
 
后退
顶部