收藏本页
联系我们
论坛帮助

>> 关于竞赛设计的各种算法,欢迎大家到此讨论
趣题之家信息学竞赛算法艺术 → 算法求解

  发表一个新帖子  发起一个新投票  回复本主题 您是本帖的第 3560 个阅读者
  标题:算法求解 树形   打印   收藏   推荐  
     帅哥哟,离线,有人找我吗?
    
    
    等级:管理员
    文章:76
    积分:238
    注册:2003-09-29
给欢乐发送一个短消息 把欢乐加入好友 查看欢乐的个人资料 搜索欢乐在的所有贴子 点击这里发送电邮给欢乐 引用回复这个贴子 回复这个贴子 楼主
发贴心情 算法求解

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


有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


欢迎你到趣题之家论坛!
发贴IP已设置保密 2004-10-04 18:38
       
     帅哥哟,离线,有人找我吗?
    
    
    等级:管理员
    文章:76
    积分:238
    注册:2003-09-29
给欢乐发送一个短消息 把欢乐加入好友 查看欢乐的个人资料 搜索欢乐在的所有贴子 点击这里发送电邮给欢乐 引用回复这个贴子 回复这个贴子 2
发贴心情

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


欢迎你到趣题之家论坛!
发贴IP已设置保密 2004-10-04 18:39
       
     帅哥哟,离线,有人找我吗?
    
    
    等级:管理员
    威望:50
    文章:291
    积分:669
    注册:2003-05-18
 QQ 给趣题之主发送一个短消息 把趣题之主加入好友 查看趣题之主的个人资料 搜索趣题之主在的所有贴子 点击这里发送电邮给趣题之主 访问趣题之主的主页引用回复这个贴子 回复这个贴子 3
发贴心情

我抛砖引玉,贴一个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
  剩余串中每个数减一

发贴IP已设置保密 2004-10-06 14:05
       
     帅哥哟,离线,有人找我吗?
    
    
    等级:管理员
    文章:76
    积分:238
    注册:2003-09-29
给欢乐发送一个短消息 把欢乐加入好友 查看欢乐的个人资料 搜索欢乐在的所有贴子 点击这里发送电邮给欢乐 引用回复这个贴子 回复这个贴子 4
发贴心情

谢谢

好思想


欢迎你到趣题之家论坛!
发贴IP已设置保密 2004-10-06 14:40
       
     帅哥哟,离线,有人找我吗?
    
    
    等级:版主
    文章:23
    积分:129
    注册:2004-08-17
给ppatsname发送一个短消息 把ppatsname加入好友 查看ppatsname的个人资料 搜索ppatsname在的所有贴子 点击这里发送电邮给ppatsname 引用回复这个贴子 回复这个贴子 5
发贴心情

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.

发贴IP已设置保密 2004-11-03 21:35
       
     帅哥哟,离线,有人找我吗?
    
    
    头衔:ENDLESS
    等级:版主
    文章:36
    积分:116
    注册:2004-11-24
给remlostime发送一个短消息 把remlostime加入好友 查看remlostime的个人资料 搜索remlostime在的所有贴子 点击这里发送电邮给remlostime 引用回复这个贴子 回复这个贴子 6
发贴心情
dfs检查一下
发贴IP已设置保密 2005-03-11 18:23
       

 6   6   1/1页      1    


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

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