for i:=1 to 3
 for j:=2 to 4
  for k:=3 to 5
不知道对不对,没试,瞎蒙的

解决方案 »

  1.   

    如何从任意个数中抽取出任意个数的全部组合。比如说  从  五 个数(1、2、3、4、5)中抽取三个数的全部组合。
    有:123 124 125 234  245 等。要全部的,并且不能出现象125 、 152 这样的重复号。
    --------------------------------------------------
    注意:您说到,是任意的个数中抽取任意个数的//应该是随机的;
    全部组合//固定的;
    所以,我觉的,你要以检查是否全部抽取到为外层,然后进行随机的抽取;
    while Not 全部抽取时 do
    begin
      随机抽取;
      for I := 0 to M do
      begin
        if 存在 then 
        begin
          T := False;
          Break;
        end;
        Inc(M);
      end;
    end;
      

  2.   

    组合问题,C53
    for i:=1 to 5
     for j:= i+1 to 5
       for k:= j+1 to 5
       begin
         showmessage(inttostr(i) + inttostr(j) + inttostr(k));
       end
      

  3.   

    不会吧???这种问题,我想高中生很可能初中生都知道const
      ARRMax = 5;
      a: array [1..ARRMAX] of integer=(1, 2, 3, 4, 5);
    var
      b: array [1..ARRMAX] of Integer;procedure print;
    var
      i: Integer;
    begin
      for i := 1 to ARRMax do 
        write(b[i]);
      writeln;
    end;procedure DoIt(w: Integer);
    var
      i: Integer;
    begin
      if w=ARRMAX+1 then Print
      else
      for i := w to ARRMAX do
      begin
        b[w] := a[i];
        DoIt(w+1);
      end;
    end;{Main}
    begin
      DoIt(1);
    end;
      

  4.   

    呵呵,不好意思,我的程序是取五个数的,如果是三个数的话,修改如下:procedure print;
    var
      i: Integer;
    begin
      for i := 1 to 3 do 
        write(b[i]);
      writeln;
    end;procedure DoIt(w: Integer);
    var
      i: Integer;
    begin
      if w=4{要几个这儿就几+1} then Print
      else
      for i := w to ARRMAX do
      begin
        b[w] := a[i];
        DoIt(w+1);
      end;
    end;
      

  5.   

    P5(3),是怎么写的吧~~~中学时的东西,记不清了~~~
    好象是怎样吧PM(n) = M*(M-1)*(M-2)*.....M(M-n+1),是个排列的问题吗~~
    条件是m>n,我实在记不清了~~~~~错了别怪我
      

  6.   

    唉,对不起各位兄弟姐妹、江东父老,修改Bug如下:哈哈哈。procedure DoIt(w: Integer);
    var
      i: Integer;
    begin
      if w=3 then Print
      else
      if w=0 then
      for i := 1 to ARRMAX do
      begin
          b[w+1] := a[i];
          DoIt(w+1);
      end
      else
      for i := b[w]+1 to ARRMAX do
      begin
          b[w+1] := a[i];
          DoIt(w+1);
      end;
    end;
      

  7.   

    对不各位兄弟姐妹,江东父老,正确如下:哈哈 
    procedure DoIt(w: Integer);
    var
      i: Integer;
    begin
      if w=3 then Print
      else
      if w=0 then
      for i := 1 to ARRMAX do
      begin
          b[w+1] := a[i];
          DoIt(w+1);
      end
      else
      for i := b[w]+1 to ARRMAX do
      begin
          b[w+1] := a[i];
          DoIt(w+1);
      end;
    end;{main}
    begin
      DoIt(0);
    end;
      

  8.   

    大家看清楚,题目没那么简单
    a[I+1] >a[I]
    这是曾经的一道高程考试题目,用回溯法解决
      

  9.   

    const
      ARRMax = 5;
      a: array [1..ARRMAX] of integer=(1, 2, 3, 4, 5);
    var
      i,j,k: integer;
    begin
    for i:=1 to ARRMax
     for j:= i+1 to ARRMax 
       for k:= j+1 to ARRMax 
       begin
         showmessage(inttostr(i) + inttostr(j) + inttostr(k));
       end
    end;
      

  10.   

    奇怪!只有初中毕业数学水平的人为什么会这么狂,看来网络的力量是无穷的!
    到底是大家可能不懂还是你可能不懂!M个数去N个(M>=N)组合个数:M*(M-1)*...*(M-(N-1))/(N*(N-1)*...*1),你用计算器也好,口算也好,写程序也好.呵呵,算法问题!
      

  11.   

    回答: dut(大工)你可能是搞错了。可能你真的会。可是你要知道,现在要求的全部功能,并不是简单的一个计算公式。一共用多少个?我想谁都基本上知道!可是你想过没有?如何去把他排列出来。一个一个组。听说递归是比较不好的。
     
    至于随机的也不对。要一层一层的把数组排列出来才对。
    可能对某些人来说理解不难,可是我不行。
    再说简单一些。
    从1到50之间,抽12个数的所有组合。
    你来试试。写出来全部源程序。:)呵,编写了你就知道了。
      

  12.   

    我在bcb中实现过,代码大致如下,从js个元素中选出js_needed个元素的所有排列,其中cur_classroom是个堆栈,内重循环结束后,放了第i种排列中的js_needed个元素,函数valid_set(cur_classroom))判断这个排列是否可用,按你的要求去全部组合的话,这个函数可以来判断是否有重复,是否有逆序就行了
       for(int i=0;i<int(pow(js,js_needed));i++)
       {
          for(int j=0;j<js_needed;j++)
          {
             int jsindex=(i/int(pow(js,j)))%js;
             cur_classroom.push(valid_classroom->Names[jsindex]);
          }
          if(valid_set(cur_classroom))
          {
             ...
          }
       }
      

  13.   

    忘了说了cur_classroom.push(valid_classroom->Names[jsindex]);中的valid_classroom->Names[jsindex]是个tstringlist,是存放了所有js个元素的数组
      

  14.   


    我的想法:
    很明显,该模型可以转成如下模型:
    (*********************************************************)
    (*   给定一个长度为m的二进制串, 列出任n位为真的组合。   *)
    (*********************************************************)// 因为下面用到幂乘,
    // 这里借用一下BASIC里的幂乘运算符^,即a^b表示a的b次方首先想到的当然是最弱智的算法(未经优化的枚化法)
    for I := 0 to 2^m -1 do
      if TrueBitCount(I) = n then 
        Writeln(I); 
    // 如果位为真的数目为n, 则符合条件当m值很小时,这个算法也许还能忍受。
    但当m值每加1时,工作量将呈几何级数增长。必须优化一下此算法!
    显然,关键是如何找出下一个符合条件的数的值是什么!
    观察此数列:(m = 5, n = 3)
    0000 0111   至少得从111开始,我们记达到的最高位为t,此时t为2)
    0000 1011   ( + 100 = 2^t))
    0000 1101   ( + 010 = 2^(t-1))
    0000 1110   ( + 001 = 2^(t-2)) (规律是:依次减1,直至为0为止)
    0001 0011   ( +1000 = 2^(t))   (内循环结束,t将加1成为3)
    0001 0101   ...
    0001 0110   ...
    0001 1001   ...
    0001 1010   ...
    0001 1100   ...+0001 = 2^(t- t) (无法再进位了,枚举结束)
    ------------------------------------
    于是改进算法如下(为清晰起见,没对里面的幂乘优化,幂乘算法的优化相信只要学过3分钟编程的人都能写出来。)
    -------------------------------------
    Value := 2^n - 1;
    for t := (n - 1) to (m - 2) do // 因为是从第0位开始,所以 m=5时,能达到的最高位为4
      for I := t downto 0 do
        Value := Value + 2^I;      -------------------------------------呵呵,写得可能比较乱,不知大家能不能理解。
      

  15.   

    这个问题,不懂的人看会觉得很简单。
    我同意westfly(西翔) 的看法,我的代码是在m个可用教室中选n个,另有若干条件判断哪一组最优。
    因为可用教室及容量是dataset中取出的,不是简单的数字,不方便优化,所以专门用了个函数valid_set(cur_classroom))判断这个排列是否有效。
    实际运行时如果可用教室有一百多个,需要的教室为8个时,超过十小时也没运行完。
      

  16.   

    这个问题是否简单根本没有必要讨论,大家可以写以下一个小程序,输入m,n两个整数,输出从1到m这m个整数中取n个数的所有组合情况,程序应该不会超过30行,只要明白道理应该很快就能写好,如果没什么困难就能实现就是高手,否则就是根本就看不出这个问题是怎么回事