暴力枚举的掌握过程
文章目录前言暴力枚举的认知刷题排列组合分步分步变种分步再变种分类总结前言我想写一篇有关编程学习过程的专栏( •̀ ω •́ )✧但是在我构建计划的时候我发现我除了数学能学其他的都没能力操作所以我得开几个小文章记录做一做编程相关的刷题笔记(っ °Д °;)っ目的是掌握最基本的暴力枚举工具我不知道难度啊目前之后就可以结合一些简单的数学题型去掌握基础的编程技巧了ψ(∇´)ψ文章的存在逻辑就是先暴力枚举建立编程感觉建好了才能开始真的编程(●ˇ∀ˇ●)目标就是看见一道能理解的题都能写出其暴力枚举的Python代码不知道是不是有点高这个目标 ≧ ﹏ ≦暴力枚举的认知循环/递归列出所有情况条件筛选返回值暴力解法不是必须要数学但是需要查表把逻辑翻译成代码。也就是先把逻辑梳理出来再试着全部暴力地铺开筛选或剪枝把正确答案输出。数学起到压缩暴力铺开过程的作用筛选或者剪枝就是主要的逻辑做法先把逻辑梳理出来再将所有情况铺开再把逻辑翻译成代码从所有情况里面挑答案懂逻辑不懂逻辑数据量太大否是逻辑梳理暴力枚举筛选/剪枝查阅资料数学公式理解正确?高级算法刷题排列组合排列逻辑梳理没有顺序的公理全部铺开然后使出筛选条件这个技能以A 3 3 A_3^3A33为例子开始ABCABABCACACBBABACBCBCACACABCBCBAcount 0 #所有情况铺开 for i in range(3): for j in range(3): for k in range(3): #筛选或剪枝 if i ! j and i!k and j!k: count 1 print(count)组合逻辑梳理组合是规定了顺序的情况此时必须得一边循环一边剪枝不然后面筛选条件很难写想一想假设C a b C_a^bCab全部情况铺开a b a^bab种除了需要满足b bb个元素之间互不相同以外还要满足出现过一次的情况不出现第2 22次第3 33次第b ! b!b!次可以观察我上述描述出现的问题对就是被数学过拟合了全部展开就展开嘛背这么多数据出来搞毛啊代码又不是通过数据编的度长絜大比权量力[突然冒出来这么一句真是ごめんなさい]总之就是一些逻辑符号连接的不要动不动就把数据背出来。下面是修改后的逻辑梳理版本逻辑梳理组合是规定了顺序的情况此时必须得一边循环一边剪枝不然后面筛选条件很难写想一想首先需要全部情况铺开之后除了需要满足b bb个元素之间互不相同以外还要满足先后顺序这种先后顺序也可以作为一种公理记住比如此处可以比较大小统一大的放前边或者小的放前边无非就是大于小于的逻辑。哈哈哈最后发现也可以不用一边循环一边剪枝。所以逻辑啥的得自己推一推不能想当然或者纯靠感觉阿西吧。以C 3 2 C_3^2C32为例子# 暴力枚举版本 count0 for i in range(3): for j in range(3): if i ! j: if ij: count 1 print(count)# 剪枝版本 count0 for i in range(3): for j in range( i1,3): count 1 print(count)分步有 3 个苹果和 3 个香蕉现在选择 2 个苹果和 2 个香蕉每天吃一个水果问有多少种安排方法。本质就是整合(integrate)不同的代码逻辑apples[a1,a2,a3] bananas[b1,b2,b3] count0 for i in range(len(apples)): for j in range(i1,len(apples)): for k in range(len(bananas)): for m in range(k1,len(bananas)): for n in range(4): for o in range(4): for p in range(4): for q in range(4): if n!o and n!p and n!q and: count1 print(count)通过多重嵌套循环枚举所有路径本质上就是在执行乘法原理分步变种从 3 个苹果选 2 个但如果选了 A1 就不能选 A3从 3 个香蕉选 2 个但如果选了 B2第二天就不能吃香蕉。问有多少种方案方便AI对照答案的问题版本有 3 个苹果和 3 个香蕉从 3 个苹果选 2 个但如果选了 A1 就不能选 A3现在选择 2 个苹果和 2 个香蕉每天吃一个水果其中当从 3 个香蕉选 2 个时如果选了 B2第二天就不能吃香蕉。问有多少种安排方法。apples[a1,a2,a3] bananas[b1,b2,b3] count0 for i in range(len(apples)): for j in range(len(apples)): if i!j: if ij: #限制条件一如果选了 A1 就不能选 A3 if apples[i]a1 and apples[j]a3:continue selected_apples[apples[i],apples[j]] for k in range(len(bananas)): for l in range(len(bananas)): if k!l: if kl: selected_bananas[bananas[k],bananas[l]] poolselected_applesselected_bananas for m in range(4): for n in range(4): if m!n: for o in range(4): if o!m and o!n: for p in range(4): if p!m and p!n and p!o: #限制条件二如果选了 B2第二天就不能吃香蕉 if b2in selected_bananas: # if pool[n] in bananas:continue if pool[n]b2:continue elif pool[n]b1:continue elif pool[n]b3:continue else: count1 else: count1 print(count)分步再变种A1 和 A3 不能同时选。如果选了 A2就不能选 B1假设香蕉 B1 是索引 0。问AI对答案版本有 3 个苹果和 3 个香蕉从 3 个苹果选 2 个但如果选了 A1 就不能选 A3现在选择 2 个苹果和 2 个香蕉每天吃一个水果。如果选了A2就不能选B1。问有多少种安排方法。apples[a1,a2,a3] bananas[b1,b2,b3] count0 for i in range(len(apples)): for j in range(len(apples)): if i!j: if ij: #限制一A1和A3不能同时选 if apples[i]a1 and apples[j]a3:continue selected_apples[apples[i],apples[j]] for k in range(len(bananas)): for l in range(len(bananas)): if k!l: if kl: selected_bananas[bananas[k],bananas[l]] poolselected_applesselected_bananas for m in range(4): for n in range(4): if m!n: for o in range(4): if o!m and o!n: for p in range(4): if p!m and p!n and p!o: #限制条件二如果选了 A2就不能选 B1 if a2in pool: if b1 in pool:continue else: count1 else: count1 print(count)分类从 3 名社恐和 5 名社牛中挑选 1 人搬东西挑选 1 人帮老师接水挑选 1 人接送老师要求至少要有 1 名社恐共有几种不同方案kong[k1,k2,k3] n[n1,n2,n3,n4,n5] totalkongn #三条线三种情况三种计数 count_10 count_20 count_30 count0 for i in range(len(total)): for j in range(len(total)): for k in range(len(total)): if i!j and i!k and j!k: #全部铺开以后 #开始筛选分类把i,j,k对应的元素提取出来揉捏 person1,person2,person3total[i],total[j],total[k] # 三种情况 count_00 if person1 in kong: count_01 if person2 in kong: count_01 if person3 in kong: count_01 #三种计数 if count_01: count_11 elif count_02: count_21 elif count_03: count_31 #加起来 countcount_1count_2count_3 print(count)有 6 个人甲、乙、丙、丁、戊、己排成一横排最左方只能是甲或者是乙且最右端不能是甲问有多少种排列方法。有 5 个人甲、乙、丙、丁、戊排成一横排甲不能站在两端丙要和丁相邻问有多少种不同的排列方法。有 6 个人甲、乙、丙、丁、戊、己排成一横排甲乙必须相邻丙丁不能相邻问有多少种不同的排列方法。现有 6 个数字从 0 到 5问这 6 个数字能组成的不相同的四位偶数的个数。求方程 x_1x_2x_3x_48 的正整数解的个数现有 6 个数字从0 到 5问这 6个数字能组成的不相同的五位奇数的个数文章刷题主要参考链接未完待续总结