以文本方式查看主题

-  趣题之家  (http://www.qthome.org/bbs/index.asp)
--  算法艺术  (http://www.qthome.org/bbs/list.asp?boardid=38)
----  算法求解  (http://www.qthome.org/bbs/dispbbs.asp?boardid=38&id=142)

--  作者:欢乐
--  发布时间:10/4/2004 6:38:19 PM

--  算法求解

我正在编一个程序,需要用到一个算法。我百般思考终于没有解决这个难题。最终我改用了其他的算法。不过我还是对这个未解决的算法很感兴趣,于是写在这里求解


有n个数,分别是 1,2,3,…,n
现在要写出这n个数的所有组合方式(就是随便选择这几个数,共有2^n-1种选法),用这样的方法:


首先 选中 1。只有“1”被选中,其他的数字都没有选中。这是第1种组合方式。
然后循环以下步骤:
    如果最后一个选中的数后面仍然有未选中的数,就选中最后一个选中的数后面的一个数,形成下一个组合方式。
    如果最后一个选中的数就是最后一个数,就去掉选中已选中的最后一个数和已选中的倒数第二个数,并选中去掉选中这两个数前的已选中的倒数第二个数的后一个数,形成下一个组合方式。



比如n=4
组合结果是这样的:


第X种组合方式     为
     1           1
     2           1,2
     3           1,2,3
     4           1,2,3,4
     5           1,2,4
     6           1,3
     7           1,3,4
     8           1,4
     9           2
     10          2,3
     11          2,3,4
     12          2,4
     13          3
     14          3,4
     15          4
次为1,2,3,4四个数的所有组合结果


问题是,我想做到输入一种组合结果,让电脑计算出这是第几种组合方式


例如,输入n=4
输入 2,3,4
输出 11


--  作者:欢乐
--  发布时间:10/4/2004 6:39:09 PM

--  

不希望模拟,希望要很快的数学计算方案


--  作者:趣题之主
--  发布时间:10/6/2004 2:05:36 PM

--  

我抛砖引玉,贴一个O(n)的

   n    串    Base
   4   2 3 4   0
   3   1 2 3   8
   2   1 2     9
   1   1       10
   0           11
Ans=11
即对于一个串,如果其最高位(左端)不为1,则:
  Base:=Base+2^(n-1)
  串中的每一个数减一
  n-1
如果最高位为1,则
  Base:=base+1
  去掉这个1
  n:=n-1
  剩余串中每个数减一


--  作者:欢乐
--  发布时间:10/6/2004 2:40:24 PM

--  

谢谢

好思想


--  作者:ppatsname
--  发布时间:11/3/2004 9:35:59 PM

--  

var
  a:array[1..63]of int64;
  b:array[1..60]of integer;
  i,j,k,l,n,m,answer:longint;
begin
  readln(n);
  a[1]:=2;
  for i:=2 to n-1 do
    a:=a[i-1]*2;
    j:=0;
  while not eoln do
    begin
      inc(j);
      read(b[j]);
    end;
  while b[1]>0 do
    begin
      if b[1]=1
        then begin
          for i:=1 to j-1 do
            b:=b[i+1]-1;
            b[j]:=0;
            inc(answer);
            dec(j);
          end
        else begin
        inc(answer,a[n-1]);
        for i:=1 to j do
          b:=b-1;
        end;
      dec(n);
    end;
  writeln(answer);
end.


--  作者:remlostime
--  发布时间:3/11/2005 6:23:32 PM

--  
dfs检查一下


网上贸易 创造奇迹! 阿里巴巴 Alibaba

Powered By Dvbbs Version 7.1.0
Copyright ©2003 - 2006 QTHome.Org
页面执行时间 00.07813 秒, 2 次数据查询
本论坛采用阿里巴巴支付宝网上银行支付系统,安全、可靠、便捷