有限重数的多重集合

定义:多重集合的元素的重数如果是有限个,那么就称它为有限重数的多重集合
M = { k 1 ⋅ a 1 , k 2 ⋅ a 2 , … , k n ⋅ a n } M = \{k_1\cdot a_1, k_2\cdot a_2, \ldots, k_n\cdot a_n\} M={k1​⋅a1​,k2​⋅a2​,…,kn​⋅an​}
当系数全为无穷时,计算它的 r r r-组合数可以用公式
( n + r − 1 r ) \binom{n+r-1}{r} (rn+r−1​)
计算。
但是如果重数有限的话,没有现成的公式,但可以使用容斥原理计算。

容斥原理方法

简要思想:对于多重集合 M M M,设集合 A i = { r A_i=\{r Ai​={r组合中元素 a i a_i ai​的个数 ≥ k i + 1 } , i = 1 , 2 , … , n \geq k_i+1\},i=1,2,\ldots,n ≥ki​+1},i=1,2,…,n,那么满足条件的 r − r- r−组合数一共有
∣ A 1 c ∩ A 2 c ∩ … ∩ A n c ∣ | A_1^c \cap A_2^c \cap \ldots \cap A_n^c| ∣A1c​∩A2c​∩…∩Anc​∣
用容斥原理可以计算出来。

Python程序实现

# -*- coding: utf-8 -*-def fact(m):'''阶乘'''if m == 0:return 1else:Times = 1for i in range(1, m+1):Times = Times * ireturn Timesdef binom(m, n):'''m取n的组合数'''if n > m:return 0elif n <= m:return fact(m) // (fact(m-n) * fact(n))def mutipl_binom(ele_num, prpo_num, r):'''获得系数为无穷的有限k不同元素多重集的r组合数'''if prpo_num > r:return 0else:return binom(r-prpo_num + ele_num-1, r-prpo_num)def true_to_run(lst, R):'''判断多重集元素总数是否大于r-组合数'''if '-' in lst or sum(lst) >= R:return Trueelse:return Falsedef get_properties_num(lst, R):'''获得对立事件的性质的数量属性'''new_lst = [0]*len(lst)for i in range(len(lst)):if lst[i] == '-':new_lst[i] = R + 1else:new_lst[i] = lst[i] + 1return new_lstdef get_binary_dic(Length):'''获得到整数n的全部二进制数'''Total = 2**Lengthbinary_dic = {x:[] for x in range(1, Length+1)}num_leq_total_lst = [bin(k)[2:] for k in range(Total)]for i in range(1, Length+1):for item in num_leq_total_lst:if item.count('1') == i:binary_dic[i].append(item)return binary_dicdef sum_kth_subset_elem(lst, k, R):'''用含有k个1的二进制数计算性质子集的元素的个数之和'''sum_elem = 0binary_lst = [s for s in get_binary_dic(len(lst))[k]]temp_1_lst = [0]*len(binary_lst)for i in range(len(binary_lst)):num_item_lst = binary_lst[i]for j in range(len(num_item_lst)):if num_item_lst[j] == '1':temp_1_lst[i] += lst[len(lst)-len(num_item_lst)+j]temp_binom_lst = [mutipl_binom(len(lst), g, R) for g in temp_1_lst]sum_elem = sum(temp_binom_lst)return sum_elemdef get_son_set_elem_sum(lst, R):'''计算全部性质集合的各种交集的元素个数,当作容斥原理的各项值'''n = len(lst)elem_sum = [0]*nfor j in range(n):if j == 0:elem_sum[j] = sum([mutipl_binom(n, lst[z], R) for z in range(n)])elif j == n-1:elem_sum[j] = mutipl_binom(n, sum(lst), R)else:elem_sum[j] = sum_kth_subset_elem(lst, j+1, R)return elem_sumif __name__ == "__main__":input_data = input("请输入多重集合系数,r组合数:")Coffe_set_lst = input_data.split()R_coffe = int(Coffe_set_lst[-1])Coffe_set_lst.pop()Length_set = len(Coffe_set_lst)for i in range(Length_set):if Coffe_set_lst[i].isdigit():Coffe_set_lst[i] = int(Coffe_set_lst[i])else:continueif not true_to_run(Coffe_set_lst, R_coffe):print("没有这样的组合")else:prop_lst = get_properties_num(Coffe_set_lst, R_coffe)elem_sum = get_son_set_elem_sum(prop_lst, R_coffe)finaly_data = binom(Length_set + R_coffe -1, R_coffe)for i in range(len(elem_sum)):finaly_data += elem_sum[i]*((-1)**(i+1))print("不同的{}组合方法有{}种".format(R_coffe, finaly_data))
__________________________________________________________________________
>>>请输入多重集合系数,r组合数:- 4 5 6 10
不同的10组合方法有175种
>>>请输入多重集合系数,r组合数:4 3 4 6 12
不同的12组合方法有50种
>>>请输入多重集合系数,r组合数:3 4 5 10
不同的10组合方法有6种

写的很有c代码的风格。不过python实现算法(验证)还是比较方便的。

用容斥原理计算具有有限重数的多重集合的 r-组合(附代码)相关推荐

  1. 独家 | 手把手教你从有限的数据样本中发掘价值(附代码)

    作者:Bety Rodriguez-Milla 翻译:和中华 校对:吴金笛 本文约2800字,建议阅读8分钟. 本文展示了当数据稀缺时,如何一步步进行分析从而得到一些见解. [ 导读 ]本文是系列文章 ...

  2. java实现编辑距离算法(levenshtein distance),计算字符串或者是文本之间的相似度【附代码】

    编辑距离算法其实就是,在规定的编辑操作(替换字符串.插入字符串.删除字符串)中,经过几步可以把一个字符串变成另一个字符串,而这个所需的步数就是你的编辑距离. 测试样例: str1 = abc str2 ...

  3. 多重集合的排列和组合问题

    多重集合的排列和组合问题 标签: permutationn2c扩展 2012-04-17 16:18 5671人阅读 评论(0) 收藏 举报  分类: 算法(12)  版权声明:本文为博主原创文章,未 ...

  4. 有关多重集合的排列和组合问题

    转载自大佬 一.先来回顾一下无重复元素的排列组合定义 排列,英文名为Permutation,是指从某元素集合中取出指定个数的元素进行排序 组合,英文名为Combination,是指从某元素集合中仅仅取 ...

  5. python众数问题给定含有n个元素的多重集合s_ACM题目:众数给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数.多重集S中重数最大的元素称为众数...

    题目: ACM题目:众数 给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数.多重集S中重数最大的元素称为众数. 例如,S={1,2,2,2,3,5}. 多重集S的众数是2,其重数 ...

  6. 名词解释 算法的有限性_欲借助 FFT 算法快速计算两有限长序列的线性卷积,则过程中要调用 ( ) 次 FFT 算法_学小易找答案...

    [单选题]计算 N=2 L ( L 为整数)点的按时间抽取基 -2FFT 需要 ( ) 级蝶形运算 [单选题]Les étudiants chinois, une fois arrivés en Fr ...

  7. python众数问题给定含有n个元素的多重集合s_2-1 问题描述:给定含有n个元素的多重集合S - 下载 - 搜珍网...

    问题描述:给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数.多重集S中重数最大的元素称为众数. ★算法设计:对于给定的由n个自然数组成的多重集S,计算S的众数及其重数. ★数据输 ...

  8. python众数问题给定含有n个元素的多重集合s_分治法求众数 给定含有n个元素的多重集合S 联合开发网 - pudn.com...

    分治法求众数 所属分类:数据结构 开发工具:C/C++ 文件大小:240KB 下载次数:3 上传日期:2018-01-04 20:19:09 上 传 者:九鼎 说明:  给定含有n个元素的多重集合S, ...

  9. 多重纹理和纹理组合器

    多重纹理和纹理组合器 本文主要介绍OpenGL中两种技术的使用方法:多重纹理技术和纹理组合器技术,最终根据参考[2]中的代码,实现了两个简单的演示DEMO,其中使用到了<八叉树颜色量化.BMP. ...

最新文章

  1. nginx 缓存设置
  2. pstack命令学习
  3. 基于Jenkins的开发测试全流程持续集成实践
  4. 连接查询_左连接/右连接/全连接的区别
  5. python计算iris数据集的均值_K均值(K-Means)
  6. git commit -m 'comment' 遇到 'npm' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  7. DLM - stackglue 层
  8. 控制台程序线程莫名被阻塞
  9. 推荐一些2021年整理的跨平台uniapp的作品案例
  10. 我在Facebook工作四年的总结与反思
  11. 【python数据结构】多维数组
  12. 徐鹤宁语录【销售篇】
  13. python_pdf常规使用
  14. 详解DNS服务、DNS解析、DNS劫持和污染
  15. 互联网公司平均薪资Top8 , 阿里勇夺第一。
  16. 高新技术企业申报材料汇编
  17. 【计算机网络】计算机网络-分组发送相关计算
  18. GPT系列详解:初代GPT
  19. vuetify图标大全
  20. 自学前端需要达到什么水平才能找到工作?

热门文章

  1. Java实战项目之人力资源管理系统【源码+课后指导】_Java毕业设计/计算机毕业设计
  2. html列表序号为圆点的,HTML_列表标签
  3. java 动态分区 链表_大二作业——操作系统实验——C语言用双向链表,模拟实现动态分区式存储管理...
  4. cv2.cvtColor(image,cv2.COLOR_RGB2BGR) opencv颜色空间的转换
  5. 软件工程(考研面试版)
  6. p4 编程语言环境配置
  7. linux安装光盘下载,教你如何下载Fedora 7安装光盘
  8. 小程序组件库ColorUI的使用,一键复制粘贴
  9. python实现栅栏加密 超简易列表版本
  10. mac nexus 资源下载及安装