百钱百鸡问题。
     公元前五世纪,我国古代数学家张丘建在《算经》一书中提出了“百鸡
问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问
鸡翁、母、雏各几何?
分析:这是一个有名的不定方程问题。
设鸡翁数为x,鸡母数为y,鸡雏数为z,则可列方程如下:
x+y+z=100
5x+3y+z/3=100⎪⎨对于上述不定方程问题,要先确定一个变量的值,才能对它求解。
由问题给出的条件,很容易得到三个变量的取值范围。
x:0~19中的整数(因为每只鸡翁5钱,因此它不可能超过19
只);
y:0~33中的整数(因为每只鸡母3钱,因此它不可能超过33
只);
z:0~100中的整数(因为共买百鸡,因此它不可能超过100只)解决该问题可以采用穷举法。穷举法是一种重复性算法。它的基本思想是
对所有可能解一一测试,直到找到解或将全部可能解都测试为止。对三个未知
量,依次取x为值域中的一个值,然后求其余两个未知量,满足方程组则为该题
的解。新建一个工程,在窗体中添加一个按钮组件,在按钮的单击事件中加入
如下代码。
var x,y,z:integer;
p:string;
begin
for x:=0 to 19 do
for y:=0 to 33 do
begin
z:=100-x-y;
if 5*x+3*y+z/3=100 then
begin
p:=format('得到一个解:鸡翁%d只,鸡母%d只,鸡雏%d只',[x,y,z]);

解决方案 »

  1.   


    你这个题目就不要考虑算法最优化了。真想研究算法的话,把题目改一下: 有n种鸡,第i种鸡的价格为a[i], 求m元钱买整数只鸡的方案。
      

  2.   

    这个我在高中时也做过
    x+y+z=100---------1
    5x+3y+z/3=100-----2
    把1代入2,消去z,得
    y=(100-7x)/4
    z=100-x-y穷举x就可以了,因为x最少procedure TForm1.Button1Click(Sender: TObject);
    var
      x,y,z:integer;
      p:string;
    begin
      for x := 0 to 19 do
      if ((100-7*x) mod 4 = 0) and ((100-7*x) div 4 >= 0) then
      begin
        y := (100-7*x) div 4;
        z := 100 - x - y;
        p:=p+format('得到一个解:鸡翁%d只,鸡母%d只,鸡雏%d只'#13#10,[x,y,z]);
      end;
      showmessage(p);
    end;