Lab3-P4-综合算法应用

第一关:找零钱问题

任务描述

假设有4种硬币,它们的面值分别为2角5分,1角、5分和1分,现在要找给某顾客x分钱,问怎样找零钱才能使给的顾客的硬币个数量少?

相关知识

算法原理

贪心法找零钱的基本思想是:每次都是选择面值不超过需要找给顾客的钱的最大面值的硬币。以上面找零钱的问来说:选出一个面值不超过6角3分的最大面值硬币2角5分找给顾客,然后还要找3角8分;选出一个面值不超过3角8分的最大面值硬币2角5分找给顾客,然后还要找1角3分;选出一个面值不超过1角3分的最大面值硬币1角找给顾客,然后还要找3 分;选出一个面值不超过3分的最大面值硬币1分找给顾客,然后还要找2分;选出一个面值不超过2分的最大面值1分找给顾客,然后还要找1分;最后选出一个面值不超过1分的最大面值硬币1 分找给顾客,这种找硬币的方法实际上就是贪心算法。

编程要求

根据提示,在右侧编辑器编写greedy函数,计算并输出找钱方案。

测试说明

平台会对你编写的代码进行测试:

测试输入: 要找给顾客的零钱,单位:分:63

(注意:63前面的信息实际上是输出)

预期输出:

要找给顾客25分的硬币:2

要找给顾客10分的硬币:1

要找给顾客5分的硬币:0

要找给顾客1分的硬币:3

找给顾客的硬币数最少为:6

# #贪心算法解决找零钱问题
v = [25, 10, 5, 1]
n = [0, 0, 0, 0]


def change():
    T = int(input('要找给顾客的零钱,单位:分:'))
    greedy(T)
    for i in range(len(v)):
        print('要找给顾客%d分的硬币:%d' % (v[i], n[i]))
    s = 0
    for i in n:
        s = s + i
    print('找给顾客的硬币数最少为:%d' % s)


def greedy(T):
    p = 0
    for p in range(len(v)):
        while T >= v[p]:
            T -= v[p]
            n[p] += 1


# # please finish this function


if __name__ == "__main__":
    change()

# ## 思考题:
# ## 如果v = [12,10,5,1]
# ## 贪心算法能得到正确的解吗?请证明。

# 不能,因为贪心算法下,每次都选择最大的那个硬币,而最大的那个硬币可能是12,
# 而设定输入为63时,易得12*4+10*1+5*1=63总计6枚硬币,贪心算法下的解为8要少。
# 只因12和10之间的差距过小

 第二关:哥德巴赫猜想

任务描述

本关任务:编写程序证明哥德巴赫猜想。

编程要求

根据提示,在右侧编辑器补充代码。

测试说明

平台会对你编写的代码进行测试:

测试输入: 90

预期输出: 7, 83

测试输入: 6

预期输出: -1, -1

# 设计一个算法,验证哥德巴赫猜想:
# 任何一个充分大的偶数(大于6)总可以表示成两个素数之和.
# 请编写python 程序实现该算法。

def prove(n):
    if n <= 6 or n % 2 != 0:
        return -1, -1
    for i in range(2, n):  # 写一个循环,用于找出答案的素数
        if sushu(i) and sushu(n - i):
            return i, n - i


def sushu(n):  # 懒了一下,这里直接写个素数判断的函数
    if n >= 2:
        for i in range(2, n):
            if n % i == 0:
                return False
    return True


if __name__ == '__main__':
    n = int(input())
    print("%d, %d" % prove(n))

# 当然你也可以写一个列表用于装所有素数(列表的大小取决于你n的输入值)
# 然后让i在上述列表里遍历,得到答案

第3关:冯诺依曼

任务描述

本关任务:编写一个实现自然数的集合表示形式。

冯•诺依曼不单是一位计算机科学家,也是很有名的数学家,他用集合来定义自然数系统,定义如下: 0 = {} = {} 1 = {0} = {{}} 2 = {0, 1} = {{}, {{}}} 3 = {0, 1, 2} = {{}, {{}}, {{}, {{}}}} …… 请根据上述定义,写出递归函数,由用户输入一个自然数N,输出该自然数对应的集合表示。例如,如输入为2,则输出为{{}, {{}}}。

测试说明

平台会对你编写的代码进行测试:

测试输入:

2

预期输出:

{{}, {{}}}

 

# ## 请编写代码

n = int(input())



def vonNeumann(n):
    sum = '{}' # 注意sum是字符串
    if n == 0:
        return sum
    if n == 1:
        return '{' + sum + '}'
    else:
        for i in range(1, n):
            sum = sum + ', ' + vonNeumann(i) # 这里是完成程序的关键,将每次的返回值都归到sum里
        return '{' + sum + '}'


print(vonNeumann(n))

  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在远方的眺望

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值