首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Python-VBA编程500例-020-01(入门级)

  • 25-03-03 04:43
  • 3256
  • 10349
blog.csdn.net

目录

1、第k个组合(仅限偶数)

1-1、Python:

1-2、VBA:

2、相关文章:

Python算法之旅:http://iyenn.com/rec/1699032.html?spm=1001.2014.3001.5502

个人主页:非风V非雨-CSDN博客

欢迎志同道合者一起交流学习,我的QQ:94509325/微信

        第k个组合(The kth Combination)的问题在实际应用中具有广泛的用途,它涉及从n个不同元素中选出k个元素的所有可能组合。这种组合的概念在许多领域都有重要的应用,常见的一些具体应用有:

1、彩票与赌博:在某些彩票或赌博游戏中,参与者需要选择特定数量的号码或符号。这些号码或符号的组合就构成了可能的赢奖情况。通过计算第k个组合,可以分析中奖概率或设计游戏规则。

2、密码学:在密码学中,组合的概念用于生成和验证密码。通过计算第k个组合,可以生成具有特定长度和字符集的密码,从而增强密码的安全性。同时,也可以利用组合的概念来破解密码,但这通常需要大量的计算资源。

3、计算机科学:在计算机科学中,组合问题常常出现在算法设计和数据分析中。例如,在搜索算法中,可能需要遍历所有可能的组合以找到最优解。此外,在数据库查询优化、机器学习特征选择等方面,也需要考虑元素的组合问题。

4、生物信息学:在生物信息学领域,组合的概念用于分析基因序列、蛋白质结构等生物数据。通过计算特定元素(如氨基酸或核苷酸)的组合,可以揭示生物分子的结构和功能特性。

5、统计学与概率论:在统计学和概率论中,组合用于计算事件发生的可能性。例如,在抽样调查中,可能需要从总体中选出一定数量的样本,这时就需要考虑样本的组合情况。此外,在概率计算中,组合也用于确定不同事件同时发生的概率。

6、商业与市场分析:在商业和市场分析中,组合的概念用于分析不同产品、服务或营销策略的组合效果。通过计算不同组合的潜在收益和风险,企业可以制定更合理的商业决策。

        总之,第k个组合的概念在实际应用中具有广泛的应用价值,它涉及从密码学到生物信息学等多个领域。通过深入理解和应用组合的概念,人们可以更好地解决实际问题并推动各领域的发展。

1、第k个组合(仅限偶数)
1-1、Python:
  1. # 1.问题描述:
  2. # 样本总数为n,且为偶数,编号分别为1,2,...,n.现需要从中挑选n/2人,有C(n, n/2)种组合方式,每一种组合方式按照编号从小到大排序,再将已排序的
  3. # 组合方式按照字典序排序,求第k个组合方式.
  4. # 2.问题示例:
  5. # 给定n=2,k=1,返回[1],所有组合方式按照字典序排序:[1],[2];
  6. # 给定n=4,k=3,返回[1, 4],所有组合方式按照字典序排序:[1, 2],[1, 3],[1, 4],[2, 3],[2, 4],[3, 4].
  7. # 3.代码实现:
  8. class Solution:
  9. # 参数k: 需要寻找的组合组的序号
  10. # 参数n: 样本总数,即参与组合的元素个数
  11. # 返回值answer: 符合要求的组合组的有序排列(列表形式)
  12. def get_kth_Combination(self, n, k):
  13. # 初始化一个大小为(n+1) x (n+1)的二维列表C,用于存储组合数
  14. C = [[0] * (n + 1) for _ in range(n + 1)]
  15. # 设置组合数矩阵C的第一列和对角线上的所有元素为1
  16. for i in range(n + 1):
  17. C[i][0], C[i][1] = 1, 1
  18. # 根据组合数的递推关系计算矩阵C的其他元素
  19. for i in range(1, n + 1):
  20. for j in range(1, i):
  21. C[i][j] = C[i - 1][j - 1] + C[i - 1][j]
  22. # 初始化结果列表answer
  23. answer = []
  24. # 初始化当前索引curr_index为1
  25. curr_index = 1
  26. # 遍历一半的范围来寻找合适的基
  27. for i in range(1, n // 2 + 1):
  28. # 计算当前索引位置在矩阵C中的对应值作为基
  29. base = C[n - curr_index][n // 2 - i]
  30. # 当k大于基时,向后移动curr_index并更新基的值
  31. while k > base:
  32. curr_index += 1
  33. base += C[n - curr_index][n // 2 - i]
  34. # 减去当前索引对应的组合数,确保base是下一个索引之前的组合数总和
  35. base -= C[n - curr_index][n // 2 - i]
  36. # 更新k值
  37. k -= base
  38. # 将当前索引添加到答案列表中
  39. answer.append(curr_index)
  40. # 索引向后移动一位
  41. curr_index += 1
  42. # 返回找到的第k组组合的有序列表
  43. return answer
  44. # 主函数
  45. if __name__ == '__main__':
  46. # 设置总人数n为4
  47. n = 4
  48. # 设置需要查找的组合组序号k为3
  49. k = 3
  50. # 创建一个Solution对象
  51. solution = Solution()
  52. # 打印当前的总人数和需要查找的组合组序号
  53. print("总人数:", n, "找第k组:", k)
  54. # 调用get_kth_combination方法获取第k组组合,并打印结果
  55. print("第k组:", solution.get_kth_Combination(n, k))
  56. # 4.运行结果:
  57. # 总人数: 4 找第k组: 3
  58. # 第k组: [1, 4]
1-2、VBA:
  1. Rem 自定义函数,功能:第k个组合(仅限偶数)
  2. Function GetKthCombination(n As Long, k As Long) As Variant
  3. ' 定义Pascal三角形数组
  4. Dim C() As Long
  5. ' 循环变量
  6. Dim i As Long, j As Long
  7. ' 存储结果的数组
  8. Dim answer() As Variant
  9. ' 当前索引
  10. Dim currIndex As Long
  11. ' 临时存储基础值
  12. Dim base As Long
  13. ' 临时存储k值
  14. Dim tempK As Long
  15. ' 初始化Pascal三角形数组
  16. ReDim C(1 To n + 1, 1 To n + 1)
  17. ' 初始化Pascal三角形的第一列和对角线
  18. ' (第一列和对角线元素都是1)
  19. For i = 1 To n + 1
  20. C(i, 1) = 1
  21. C(i, i) = 1
  22. Next i
  23. ' 计算Pascal三角形的其余部分
  24. ' (利用组合数公式C(n,k) = C(n-1,k-1) + C(n-1,k))
  25. For i = 2 To n
  26. For j = 2 To i
  27. C(i, j) = C(i - 1, j - 1) + C(i - 1, j)
  28. Next j
  29. Next i
  30. ' 初始化答案数组和当前索引
  31. ReDim answer(1 To n \ 2)
  32. currIndex = 1
  33. tempK = k
  34. ' 遍历Pascal三角形来找到第k个组合
  35. For i = 1 To n \ 2
  36. ' 获取基础值
  37. base = C(n - currIndex + 1, n \ 2 - i + 1)
  38. ' 遍历直到tempK小于或等于base
  39. While tempK > base
  40. currIndex = currIndex + 1
  41. ' 更新base值
  42. base = base + C(n - currIndex + 1, n \ 2 - i + 1)
  43. Wend
  44. ' 减去当前位置的组合数
  45. base = base - C(n - currIndex + 1, n \ 2 - i + 1)
  46. ' 更新tempK
  47. tempK = tempK - base
  48. ' 将当前索引存入答案数组
  49. answer(i) = currIndex
  50. ' 索引加1,准备下一个元素的查找
  51. currIndex = currIndex + 1
  52. Next i
  53. ' 返回结果数组
  54. GetKthCombination = answer
  55. End Function
  56. Rem 执行过程,功能:调用自定义函数GetKthCombination,在立即窗口中输出结果
  57. Sub TestRun()
  58. ' 定义变量
  59. Dim n As Long
  60. Dim k As Long
  61. Dim result As Variant
  62. ' 设置总人数n和需要查找的组合组序号k
  63. n = 4
  64. k = 3
  65. ' 调用自定义函数获取第k组组合
  66. result = GetKthCombination(n, k)
  67. ' 打印结果
  68. Debug.Print "总人数:" & n & " 找第k组:" & k
  69. ' 使用Join函数将数组元素用逗号连接成字符串
  70. Debug.Print "第k组:[" & Join(result, ",") & "]"
  71. End Sub
  72. '输出结果:
  73. '总人数:4 找第k组:3
  74. '第k组: [1,4]

注意:1-2中的代码需粘贴到你的VBA编辑器中,按F5执行TestRun程序,在立即窗口中输出结果。

2、相关文章:

2-1、Python-VBA编程500例-019-01(入门级) 

2-2、Python-VBA编程500例-019-02(入门级)

2-3、Python-VBA编程500例-020-02(入门级) 

2-4、Python-VBA编程500例-021(入门级) 

Python算法之旅:http://iyenn.com/rec/1699032.html?spm=1001.2014.3001.5502
个人主页:非风V非雨-CSDN博客
欢迎志同道合者一起交流学习,我的QQ:94509325/微信:

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览60120 人正在系统学习中
遨游码海,我心飞扬
微信名片
注:本文转载自blog.csdn.net的神奇夜光杯的文章"https://blog.csdn.net/ygb_1024/article/details/137058481"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top