每日一练 — 2021.11.29

本文探讨了两个计算机科学问题:一是输入整数的全排列生成,使用Python实现并展示输出;二是如何尽可能均匀地将一组数组分成两部分,使两者之和的差最小,通过示例解释和Python代码展示了动态规划解决方案。这两个问题涉及到了排序算法和优化策略,对于理解算法设计和分析有重要价值。
摘要由CSDN通过智能技术生成


一、输出整数的全排列

1,程序简介

  • 输入整数n(3<=n<=7),编写程序输出1,2,…,n整数的全排列,按字典序输出。
输入样例:
  • 输入:3
  • 输出:123 132 213 231 312 321

2,程序代码

# -*- coding: utf-8 -*-
"""
Created on Mon Nov 29 07:40:36 2021
Function: 输入整数n的全排列
@author: 小梁aixj
"""

import random
n=int(input('输入整数n(3<=n<=7):'))
t=list()
t1=set()
for i in range(1, n+1):
    t.append(str(i))
while True:
    sum = 1
    for i in range(1, n+1):
        sum *= i
    if len(t1) >= sum:
        break
    random.shuffle(t)
    t1.add("".join(t))
s=sorted(t1)
for i in s:
    print(i,end=" ")

3,运行结果

在这里插入图片描述

二、将一组数组尽可能均匀的分成两堆,使两个堆中的数的和尽可能相等

1,程序简介

  • 麦克叔叔去世了,他在遗嘱中给他的两个孙子阿贝和鲍勃留下了一堆珍贵的口袋妖怪卡片。遗嘱中唯一的方向是“尽可能均匀地分配纸牌的价值”。作为Mike遗嘱的执行人,你已经为每一张口袋妖怪卡片定价,以获得准确的货币价值。你要决定如何将口袋妖怪卡片分成两堆,以尽量减少每一堆卡片的价值总和的差异。
  • 例如,你有下列n=8 个口袋妖怪卡片:
    在这里插入图片描述
  • 经过大量的工作,你发现你可以用下面的方法来划分卡片:
    在这里插入图片描述
  • 这给了安倍10美元的牌给了鲍勃11美元的牌。这是最好的除法吗?
  • 你要做的是解决n张牌的问题其中每张牌ci都有一个正整数值vi.你的解决方法是计算牌应该如何被分割以及每摞牌的价值。
  • 输入输出示例如下:
    在这里插入图片描述
  • 1.通过检查所有可能的桩以蛮力解决此问题。 对这种蛮力算法的时间复杂度进行分析,并通过实施和实验验证您的分析结果(既写出来算法的设计思路等),并用python算法实现编程
  • 2.通过动态编程开发更有效的算法。 您应该首先通过动态编程的思想来分析此问题,并编写相应的递归属性。 对这种算法的时间复杂度进行分析,并通过实施和实验验证您的分析结果。并用python代码实现动态编程。

2,程序代码

# -*- coding: utf-8 -*-
"""
Created on Mon Nov 29 08:01:27 2021
Function: 将一组数尽可能均匀地分成两堆,使两个堆中的数的和尽可能相等
@author: 小梁aixj
"""
count=0
def deal(data, flag):
    a=[]
    for i in data:
        if i >= flag:
            return [i]
        elif a==[]:
            a.append([i])
        else:
            a=a+[k+[i] for k in a if sum(k)+i <= flag]
            a.append([i])
    target=sum(max(a, key=sum))
    return list(filter(lambda x:sum(x)==target, a))
if __name__=="__main__":
    c=[2,1,3,1,5,2,3,4]
    flag=sum(c)//2
    res=deal(c, flag)
    print(res)

3,运行结果

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梁辰兴

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

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

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

打赏作者

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

抵扣说明:

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

余额充值