求一算法, 请感兴趣的朋友进来看看(200分)

  • 主题发起人 主题发起人 konhon
  • 开始时间 开始时间
K

konhon

Unregistered / Unconfirmed
GUEST, unregistred user!
做假帐时, 按工资算考勤的逆向算法

请按下面公式算出最合适的X, Y, Z.
X * 34 + Y * 6.75 + Z * 9 = Sum

注:
1. X的单位为(天), 可以出现(半天), Y, Z 的在使用的单位为(小时)或(分钟)
2. Sum 为已知的任意一整数, > 1000

要求:
1. X的值必须小于或等于用户指定的数, 如果用户指定为23(天), 则X的值必须<=23(天)
2. Y + Z 不能大于36(小时)
3. Y / 2 < X
4. Z / 8 < 4
 
procedure TForm1.Button1Click(Sender:TObject);
var sum,x,y,z:Integer;
i,j,k:Integer;
t:Single;
flag:Boolean;
begin
sum:=1221;
for x:=23 downto 1 do
begin
t:=sum-x*34;
for y:=36 downto 1 do
begin
t:=t-y*6.75;
for z:=36-y downto 1 do
begin
if z*9=Round(t) then
begin//OK
Label1.Caption:='x:'+IntToStr(x);
Label2.Caption:='y:'+IntToStr(y);
Label3.Caption:='z:'+IntToStr(z);
exit;
end;
end;
end;
end;

ShowMessage('Err');
//X * 34 + Y * 6.75 + Z * 9 = Sum

end;
 
用穷举算法应该可以的,只是太麻烦了
 
3. Y / 2 < X
4. Z / 8 < 4

我也考慮過窮举算法, 太麻煩
 
geluyx
結果有負數............

算出來的數, 按公式來算要最接近 Sum
 
见最后一个。
 
最接近 Sum是不是大于或小于的最接近吧?
 
http://www.delphibbs.com/delphibbs/DispQ.asp?LID=3592354已答
 
不能大於Sum
 
socid
按你的計算出來, 不符合題目要求喲.
 
Procedure TForm1.Button1Click(Sender:TObject);
Var
i, j, k:Integer;
x, sum, sub, OldSub:Double;
y, z:Integer;
xmax:Integer;
rx, ry, rz:Double;
Begin
sum := 1100
//总金额
xmax := 31
//最大天数
OldSub := sum;

x := 0.5;
For i := 1 To 31 * 2 Do
Begin
For j := 1 To 36 Do
For K := 1 To 36 Do
Begin
y := j;
z := K;

If Y + Z > 36 Then Continue;
If Y / 2 >= X Then Continue;
If Z / 8 >= 4 Then continue;

sub := sum - x * 34 - y * 6.75 - z * 9;

If sub < 0 Then Continue;

If sub < OldSub Then
Begin
OldSub := sub;
rx := x;
ry := y;
rz := z;
End;
Application.ProcessMessages;
End;
x := x + 0.5;
If x > xmax Then Break;
End;

//显示结果
showmessage('X:' + FormatFloat('0.0', rx) + #10 + 'Y:' + FormatFloat('0', ry) + #10 + 'Z:' + FormatFloat('0', rz) + #10 + 'DISTANCE:' + FormatFloat('0.00', OldSub));
End;
 
我的算法是找出了一个最小的,但不一定是唯一的。
 
后退
顶部