枚举算法练习例题(Python 版)

用户头像
罗罗诺亚
关注
发布于: 2020 年 08 月 19 日
枚举算法练习例题(Python版)

枚举

  • 枚举算法是我们在日常中使用到的最多的一个算法,它的核心思想就是:枚举所有的可能

枚举法的本质就是从所有候选答案中去搜索正确的解,使用该算法需要满足两个条件:(1)可预先确定候选答案的数量;(2)候选答案的范围在求解之前必须有一个确定的集合。

  • 确定所有可能的情况

  • 有序的列举

  • 尽早排除不是解的情况

  • POJ 1543 完美立方

时限: 1000MS 内存限制: 10000K

提交总数: 17965 接受的: 8944

描述

数百年来,费马最后定理简单地证明了:对于n> 2,不存在整数a,b,c> 1,因此a ^ n = b ^ n + c ^ n仍然难以捉摸。(尽管仍在进行审查,但最新的证明被认为是正确的。)但是,可以找到大于1的整数,这些整数满足“完美立方”方程a ^ 3 = b ^ 3 + c ^ 3 + d ^ 3(例如,快速计算将显示等式12 ^ 3 = 6 ^ 3 + 8 ^ 3 + 10 ^ 3确实是正确的)。这个问题要求您编写一个程序来查找所有满足<= N的等式的数字集{a,b,c,d}。

输入项

一个整数N(N <= 100)。

输出量

输出应如下所示列出,每行一个完美的多维数据集,以a的降序排列(即,各行应按其a值排序)。b,c和d的值也应以不降序排列在行本身上。确实存在几个可以从b,c和d三元组的多个不同集合中产生的a值。在这些情况下,应首先列出b值较小的三元组。

样本输入

24

样本输出

立方体= 6,三重=(3,4,5)

立方体= 12,三重=(6,8,10)

立方体= 18,三重=(2,12,16)

立方体= 18,三重=(9,12,15)

立方体= 19,三重=(3,10,18)

多维数据集= 20,三重=(7,14,17)

立方体= 24,三重=(12,16,20



n = int(input())
l = [0]
for i in range(1,n+1):
a = pow(i,3)
l.append(a)
for a in range(2,n+1):
for b in range(2,a):
for c in range(b,a):
for d in range(c,a):
if(l[a] == l[b] + l[c] + l[d]):
print("Cube = %d, Triple = (%d,%d,%d)"%(a,b,c,d))



  • POJ 1006

描述

有人认为,一个人的生命从出生的那一天开始就有三个周期。这三个周期是身体,情感和智力周期,分别为23天,28天和33天。在一个周期的每个周期中都有一个峰值。在一个周期的高峰期,一个人在相应的领域(身体,情感或精神)上表现最佳。例如,如果这是心理曲线,则思维过程将更清晰,专心将更容易。

由于三个周期的周期不同,因此三个周期的峰值通常出现在不同的时间。我们想确定任何人何时发生三重峰(所有三个周期的峰均在同一天出现)。对于每个周期,将从当前年份开始的天数,其中出现一个高峰(不一定是第一个高峰)。您还将获得一个日期,表示为从当年年初开始的天数。您的任务是确定从给定日期到下一个三重高峰的天数。给定的日期不计算在内。例如,如果给定的日期是10,而下一个三重高峰发生在第12天,则答案是2,而不是3。如果在给定的日期中出现了三重高峰,则应指定下一次出现a的天数三重峰。

输入项

您会收到许多案例。每种情况的输入均由一行包含四个整数p,e,i和d的行组成。值p,e和i分别是从当年年初开始的身体,情绪和智力周期达到顶峰的天数。值d是给定的日期,可以小于p,e或i中的任何一个。所有值均为非负值,最多365,并且您可以假定在给定日期的21252天内将出现三重峰值。输入的结尾由一行表示,其中p = e = i = d = -1。

输出量

对于每个测试用例,以以下格式打印案例编号,然后显示一条消息,指示到达下一个三重高峰的天数:

案例1:下一个三重高峰发生在1234天。

即使答案为1,也应使用复数形式``天''。

样本输入

0 0 0 0

0 0 0 100

5 20 34 325

4 5 6 7

283 102 23 320

203301203 40

-1 -1 -1 -1

样本输出

情况1:下一个三重高峰发生在21252天。

情况2:下一个三重高峰发生在21152天。

情况3:下一个三重高峰发生在19575天。

情况4:下一个三重高峰发生在16994天。

情况5:下一个三重高峰发生在8910天内。

情况6:下一个三重高峰发生在10789天。



a,b,c,d = map(int,input().strip().split())
def w(a,b,c,d):
for i in range(d+1,21253):
if((i-a)%23 == 0):
for j in range(i,21253,23):
if((j-b)%28 == 0):
for x in range(j,21253,23*28):
if((x-c)%33 ==0):
return x-d
print(w(a,b,c,d))
  • POJ 1017

描述



工厂生产的产品包装成高度为h且尺寸为1 1、2 2、3 3、4 4、5 5、6 6的方包。这些产品始终以与产品相同高度h且尺寸为6 * 6的方形包裹交付给客户。由于费用的关系,工厂和客户的利益就是将从工厂向客户交付订购产品所需的包裹数量最小化。一个好的程序可以解决查找根据订单交付给定产品所需的最小包裹数的问题,这可以节省很多钱。要求您制作这样的程序。

输入项

输入文件由几行指定顺序组成。每一行指定一个订单。顺序用六个整数描述,每个整数之间用一个空格分隔,这些整数依次表示从最小大小1 1到最大大小6 6的各个大小的数据包数量。输入文件的末尾由包含六个零的行指示。

输出量

输出文件在输入文件的每一行中包含一行。该行包含可打包输入文件相应行中的订单的最小宗数。输出文件中没有与输入文件的最后一个``空''行相对应的行。

样本输入

0 0 4 0 0 1

7 5 1 0 0 0

0 0 0 0 0 0

样本输出

2

1个

a, b, c, d, e, f = map(int, input().strip().split())
x = 0
y = 0
z = 0
yc = [0, 5, 3, 1]
zc = [0, 7, 6, 5]
while(not a==b==c==d==e==f):
x = f + e + d + (c+3)//4
y = d * 5 + yc[c%4]
z = e * 11 + zc[c%4]
if(b>y):
k = ((b-y)+8)//9
x += k
z += (k*9+y-b)*4
else:
z += (y-b)*4
if(a>z):
k = ((a-z)+35)//36
x += k
print(x)
a, b, c, d, e, f = map(int, input().strip().split())
  • 填写运算符

输入五个数5 5 5 5 5,在其中间填入四个运算符+ - * /,使其结果等于5



A = ['+','-','*','/']
count = 0
for i in range(4):
for j in range(4):
for k in range(4):
for h in range(4):
if (eval('5'+A[i]+'5'+A[j]+'5'+A[k]+'5'+A[h]+'5') == 5):
count += 1
print(str(count) + '、5'+A[i]+'5'+A[j]+'5'+A[k]+'5'+A[h]+'5')



发布于: 2020 年 08 月 19 日 阅读数: 34
用户头像

罗罗诺亚

关注

还未添加个人签名 2020.08.14 加入

还未添加个人简介

评论

发布
暂无评论
枚举算法练习例题(Python版)