毕业旅行问题

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

输入描述:

城市个数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))

今天的第二个笔试题啦!

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

最新文章

  1. 原生JS:Number对象详解
  2. ehcache2.8.3入门示例:hello world
  3. [Python] dir() 与 __dict__,__slots__ 的区别
  4. leetcode1237
  5. JQuery中的push和join
  6. IOS开发-UI学习-UITextField的各种属性设置
  7. DevOps实践之Jenkins安装部署
  8. 七月在线爬虫班学习笔记(六)——scrapy爬虫整体示例
  9. itchat 报错 OSError: [WinError -2147221003] 找不到应用程序: &#39;QR.png&#39;
  10. for循环的简介及break和continue的区别
  11. Xamarin SQLite教程数据库访问与生成
  12. button disable and enable
  13. eclise linux c mysql
  14. php 实现简单加入购物车(1)
  15. 【Algorithm】快速排序(续)
  16. 不应直接存储或返回可变成员 Mutable members should not be stored or returned directly
  17. PRINCE2是什么?
  18. Java 8方法引用使用指南
  19. JavaScript正则表达式_常用的正则
  20. 为什么使用centos部署服务器

热门文章

  1. CentOS7安装Oracle 11g
  2. Python 实现邮件发送功能(初级)
  3. Python 图像处理 OpenCV (14):图像金字塔
  4. day5:isinstance&amp;代码块&amp;分支&amp;while循环
  5. golang第一天--安装
  6. J.U.C体系进阶(四):juc-sync 同步器框架
  7. 01 安装Linux虚拟机
  8. Makefile中的一个坑
  9. git push到远程新分支
  10. php判断是否为数字