免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: teebye
打印 上一主题 下一主题

排列组合的题,有点难度哦 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-03-20 18:06 |只看该作者
def foo(n)
  n==0 ? 1 : n*foo(n-1)
end

def cal(list)
  result = foo list.size
  list.uniq.each do |i|
   result /= foo(list.grep(i).size)
  end
  result
end

p cal([1,1,3,1])

论坛徽章:
0
12 [报告]
发表于 2009-03-20 19:31 |只看该作者

回复 #1 teebye 的帖子

问一人得到了答案...
致于多少种排法,算的是:
N为一共有多少个字符
A,B,K为某一字符的数量

N!/(A!*B!*.....K!)

例如:
'asdddff'
的排列数为
7!/(3!*2!*1!)

论坛徽章:
0
13 [报告]
发表于 2009-03-20 20:32 |只看该作者
其实很简单。

n个元素,全排列。n!

其中有m个元素重复,则这m个元素的全排列是m!

应该是

n!/(m1! * m2! *m3!。。。)

论坛徽章:
0
14 [报告]
发表于 2009-03-21 10:35 |只看该作者
原帖由 efhilt 于 2009-3-20 20:32 发表
其实很简单。

n个元素,全排列。n!

其中有m个元素重复,则这m个元素的全排列是m!

应该是

n!/(m1! * m2! *m3!。。。)

MD不的不鄙视 就没个人 能用python的代码来写这个题的答案吗?

论坛徽章:
0
15 [报告]
发表于 2009-03-21 12:37 |只看该作者

回复 #14 zhenglxd 的帖子


玩ruby哇

论坛徽章:
0
16 [报告]
发表于 2009-03-21 17:01 |只看该作者
第一小题的算法如下:
假设a表示第i种元素出现的次数(1<=i<=s,s表示元素的种类数),总次数是n
那么我们要的答案就是(n!)/[(a[1]!)*(a[2]!)*(a[3]!)*...*(a!)]
以你的第二个例子为例就是3!/(2!*1!)=3(a出现2次,b出现1次)
第二小题代码还没时间写

论坛徽章:
0
17 [报告]
发表于 2009-03-21 17:41 |只看该作者
抛砖引玉...
#!/usr/bin/python

import sys

mylist = [sys.argv[1]]

for arg in sys.argv[2:]:
        tmp = []
        for x in mylist:
                for i in range(len(x)+1):
                        y = x[:i] + arg + x[i:]
                        if y not in tmp:
                                tmp.append(y)
        mylist = tmp

print 'len:', len(mylist)
for x in mylist: print x,

用法: test.py a b c

论坛徽章:
0
18 [报告]
发表于 2009-03-22 00:47 |只看该作者
def read_str(str):
&nbsp;&nbsp;&nbsp;&nbsp;ret = {}
&nbsp;&nbsp;&nbsp;&nbsp;for c in str:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ret.has_key(c):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret[c] += 1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret[c] = 1
&nbsp;&nbsp;&nbsp;&nbsp;return ret

def fec(n):
&nbsp;&nbsp;&nbsp;&nbsp;ret = 1
&nbsp;&nbsp;&nbsp;&nbsp;assert n >= 0 and type(n) == type(1)
&nbsp;&nbsp;&nbsp;&nbsp;while n != 0:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret *= n
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n -= 1
&nbsp;&nbsp;&nbsp;&nbsp;return ret

def cal(str):
&nbsp;&nbsp;&nbsp;&nbsp;a = fec(len(str))
&nbsp;&nbsp;&nbsp;&nbsp;b  = 1
&nbsp;&nbsp;&nbsp;&nbsp;for n in read_str(str).values():
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b *= fec(n)
&nbsp;&nbsp;&nbsp;&nbsp;return a/b

if __name__ == '__main__':
&nbsp;&nbsp;&nbsp;&nbsp;test = 'aaab'
&nbsp;&nbsp;&nbsp;&nbsp;print 'there are %i arranges' % cal(test)


[ 本帖最后由 izhier 于 2009-3-22 01:00 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2009-03-22 00:59 |只看该作者
打印出各种组合有一点难度

论坛徽章:
0
20 [报告]
发表于 2009-03-22 18:08 |只看该作者
l=['a','a','b']
print factorial(len(set(l)))
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP