分割绳子的算法问题(超难)(0分)

  • 主题发起人 主题发起人 陈桂坚
  • 开始时间 开始时间

陈桂坚

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一条1000mm的绳子。。我想把这条绳子剪成75mm, 55mm, 88mm的分段绳子,其中可以有0-10mm的残余。。这个算法怎样写呢?
 
求解方程式:
75X+55Y+88Z=1000-A
其中
0<=A<=10
0<=X<=13
0<=Y<=18
0<=Z<=11
中的组合(X,Y,Z)应该比较简单的
 
能简单提供一下代码吗?
 
根据hellbeast的思路随便写了一个,没做任何优化啊

procedure TForm1.Button1Click(Sender: TObject);
var
i, j, k, a: integer;
n1, n2, n3: integer;
begin
Memo1.Clear;
n1 := 1000 div 75;
n2 := 1000 div 55;
n3 := 1000 div 88;
for i := 0 to n1 do
for j := 0 to n2 do
for k := 0 to n3 do
begin
a := 1000 - 75 * i - 55 * j - 88 * k;
if (a <= 10) and (a >= 0) then
Memo1.Lines.Add(Format('%d根75mm, %d根55mm, %d根88mm, 剩余%dmm', [i, j, k, a]));
end;
end;

运行结果:
0根75mm, 2根55mm, 10根88mm, 剩余10mm
0根75mm, 10根55mm, 5根88mm, 剩余10mm
0根75mm, 18根55mm, 0根88mm, 剩余10mm
1根75mm, 4根55mm, 8根88mm, 剩余1mm
1根75mm, 12根55mm, 3根88mm, 剩余1mm
2根75mm, 1根55mm, 9根88mm, 剩余3mm
2根75mm, 9根55mm, 4根88mm, 剩余3mm
3根75mm, 6根55mm, 5根88mm, 剩余5mm
3根75mm, 14根55mm, 0根88mm, 剩余5mm
4根75mm, 3根55mm, 6根88mm, 剩余7mm
4根75mm, 11根55mm, 1根88mm, 剩余7mm
5根75mm, 0根55mm, 7根88mm, 剩余9mm
5根75mm, 8根55mm, 2根88mm, 剩余9mm
6根75mm, 2根55mm, 5根88mm, 剩余0mm
6根75mm, 10根55mm, 0根88mm, 剩余0mm
7根75mm, 7根55mm, 1根88mm, 剩余2mm
8根75mm, 4根55mm, 2根88mm, 剩余4mm
9根75mm, 1根55mm, 3根88mm, 剩余6mm
11根75mm, 3根55mm, 0根88mm, 剩余10mm
 
procedure TForm1.Button1Click(Sender: TObject);
var
iRest,cntI,cntJ,cntK:Integer;
begin
cntI:=0;
cntJ:=0;
cntK:=0;
iRest:=0;
for cntI:=0 to 11 do
begin
iRest:=1000-88*cntI;
if (iRest<=10) and (iRest>=0) then
Memo1.Lines.Add('88mm:'+IntToStr(cntI)+' 75mm:'+IntToStr(cntJ)+' 55mm:'+IntToStr(cntK)+' 剩余:'+IntToStr(iRest))
else if iRest<0 then Break;
for cntJ:=0 to 13 do
begin
iRest:=1000-(75*cntJ+88*cntI);
if (iRest<=10) and (iRest>=0) then
Memo1.Lines.Add('88mm:'+IntToStr(cntI)+' 75mm:'+IntToStr(cntJ)+' 55mm:'+IntToStr(cntK)+' 剩余:'+IntToStr(iRest))
else if iRest<0 then Break;
for cntK:=0 to 18 do
begin
iRest:=1000-(55*cntK+75*cntJ+88*cntI);
if (iRest<=10) and (iRest>=0) then
Memo1.Lines.Add('88mm:'+IntToStr(cntI)+' 75mm:'+IntToStr(cntJ)+' 55mm:'+IntToStr(cntK)+' 剩余:'+IntToStr(iRest))
else if iRest<0 then Break;
end;
end;
end;

end;

运行结果:
88mm:0 75mm:0 55mm:18 剩余:10
88mm:0 75mm:3 55mm:14 剩余:5
88mm:0 75mm:6 55mm:10 剩余:0
88mm:0 75mm:11 55mm:3 剩余:10
88mm:1 75mm:4 55mm:11 剩余:7
88mm:1 75mm:7 55mm:7 剩余:2
88mm:2 75mm:5 55mm:8 剩余:9
88mm:2 75mm:8 55mm:4 剩余:4
88mm:3 75mm:1 55mm:12 剩余:1
88mm:3 75mm:9 55mm:1 剩余:6
88mm:4 75mm:2 55mm:9 剩余:3
88mm:5 75mm:0 55mm:10 剩余:10
88mm:5 75mm:3 55mm:6 剩余:5
88mm:5 75mm:6 55mm:2 剩余:0
88mm:6 75mm:4 55mm:3 剩余:7
88mm:7 75mm:5 55mm:2 剩余:9
88mm:7 75mm:5 55mm:0 剩余:9
88mm:8 75mm:1 55mm:4 剩余:1
88mm:9 75mm:2 55mm:1 剩余:3
88mm:10 75mm:0 55mm:2 剩余:10
 
[:D][:D][:D][:D][:D][:D]
 
后退
顶部