zoukankan      html  css  js  c++  java
  • Python笔试——毕业旅行问题

    毕业旅行问题

    小明目前在做一份毕业旅行的规划。打算从北京出发,分别去若干个城市,然后再回到北京,每个城市之间均乘坐高铁,且每个城市只去一次。由于经费有限,希望能够通过合理的路线安排尽可能的省一些路上的花销。给定一组城市和每对城市之间的火车票的价钱,找到每个城市只访问一次并返回起点的最小车费花销。

    输入描述:

    城市个数n(1<n≤20,包括北京)

    城市间的车票价钱 n行n列的矩阵 m[n][n]

    输出描述:

    最小花销 s

    输入例子1:

    4
    
    0 2 6 5
    
    2 0 4 4
    
    6 4 0 2
    
    5 4 2 0

    输出例子1:

    13

    例子说明1:

    共 4 个城市,城市 1 和城市 1 的车费为0,城市 1 和城市 2 之间的车费为 2, 城市 1 和城市 3 之间的车费为 6,城市 1 和城市 4 之间的车费为 5。 依次类推。假设任意两个城市之间均有单程票可购买,且票价在1000元以内,无需考虑极端情况。

    思路:

    1、permutations模块

    这里我的第一想法就是遍历所有的情况计算路费进而去最小值。

    那么这里如果要遍历所有路线的话,可以用到permutations模块来获取所有的排列结果。

    下面用一个列表来说明permutations模块的用法:

    from itertools import permutations
    li = [1,2,3]
    print(permutations(li))
    for i in permutations(li):
        print(i)

    代码执行结果如下:

    <itertools.permutations object at 0x000001A15C7B17C8>
    (1, 2, 3)
    (1, 3, 2)
    (2, 1, 3)
    (2, 3, 1)
    (3, 1, 2)
    (3, 2, 1)

    可看到permutations函数返回的是一个可迭代对象,而不是列表类型, 所以打印的时候不会打印列表。

    另外要格外注意的是,permutations函数得出的所有排列情况是元组类型而非列表。

    permutations()可加第二个参数,代表排列的长度:

    from itertools import permutations
    li = [1,2,3]
    print(permutations(li))
    for i in permutations(li,2):
        print(i)

    代码执行结果如下:

    <itertools.permutations object at 0x0000022604F827C8>
    (1, 2)
    (1, 3)
    (2, 1)
    (2, 3)
    (3, 1)
    (3, 2)

    2、代码实现

    import itertools
    n = int(input()) #城市个数n(1<n≤20,包括北京)
    L = [] #城市间的车票价钱 n行n列的矩阵 [n][n]
    for i in range(n):
        L.append(list(map(int, input().split(' '))))
     
    def treaval(L, n):
        # 除起点之外的不同路线组合,假设起点为0号节点
        com = list(itertools.permutations(list(range(1, n)), n - 1))  #range函数返回的是一个可迭代对象,而不是列表类型, 所以打印的时候不会打印列表。
        spend = 9999  # 假设一开始花销很大
        for j in range(len(com)): #len(com)是可选择的路线种类数
            road = list(com.pop(0))# 获取其中一种路线组合road列表之后就释放,com是一个元组序列
            # 补全起点和终点(注意起点也是终点,形成闭环)此时road长度为n+1
            road.append(0)#在列表末尾添加新的对象
            road.insert(0, 0)#将对象插入列表
            x = 0 # 当前路线的花销
            for i in range(n):
                x = x + L[road[i]][road[i + 1]]
            if x < spend:
                spend = x #更新最小花销
        return spend
     
    print(treaval(L, n))

    今天的第二个笔试题啦!

    出去跑个步,回来继续加油~

  • 相关阅读:
    数据库锁机制
    spring的事务传播行为与隔离级别
    Logback+ELK+SpringMVC搭建日志收集服务器
    提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)
    有状态的bean和无状态的bean的区别
    浅谈Spring解决循环依赖的三种方式
    某类继承thread,同时实现runnable
    java动态代理
    缓存一致性
    Elasticsearch系列(一)--入门
  • 原文地址:https://www.cnblogs.com/sunny0824/p/13442501.html
Copyright © 2011-2022 走看看