题目要求:

有n份作业分配给n个人去完成,每人完成一份作业。假定第i个人完成第j份作业需要花费cij时间, cij>0,1≦i,j≦n。试设计一个回溯算法,将n份作业分配给n个人完成,使得总花费时间最短。

题目分析:

由于每个人都必须分配到工作,在这里可以建一个二维数组C[k][i],用以表示k号工人完成i号工作所需的费用。给定一个循环,从第1个工人开始循环分配工作,直到所有工人都分配到。为第k个工人分配工作时,再循环检查每个工作是否已被分配,没有则分配给k号工人,否则检查下一个工作。可以用一个二维数组t[k][j]来表示第i号工作是否被k号人分配,未分配则x[k][i]=0,否则x[k][i]=1。利用回溯思想,在工人循环结束后回到上一工人,取消此次分配的工作,而去分配下一工作直到可以分配为止。这样,一直回溯到第1个工人后,就能得到所有的可行解。在检查工作分配时,其实就是判断取得可行解时的二维数组的一下标都不相同,二下标同样不相同。(我用的递归实现,也可以用栈来实现)

Python3 实现:

# @Time :2018/5/8

# @Author :LiuYinxing

class Solution:

def __init__(self, p):

self.n = len(p) # 获取n大小

self.minP = float("inf")

self.tempMinP = 0

self.p = p # 人员花费时间表

self.t = [[0] * self.n for _ in range(self.n)] # 标记数组

self.path = None

self.b = 0 # 记录是否已经走完一趟(0 无,1 走完一次)

def isok(self, k, i):

for j in range(self.n):

if self.t[k][j] == 1: return False # 第k人是否已经分配工作

for j in range(self.n):

if self.t[j][i] == 1: return False # 第i项工作是否已经被分配

return True

def getMinP(self, k=0):

if self.b == 1 and self.tempMinP >= self.minP: return # 进行减枝

if k == self.n:

self.b == 1

if self.tempMinP < self.minP:

self.minP = self.tempMinP

self.path = [v.index(1) + 1 for v in self.t] # 记录路径

return

for i in range(self.n):

if self.isok(k, i):

self.tempMinP += self.p[k][i]

self.t[k][i] = 1

self.getMinP(k + 1)

self.tempMinP -= self.p[k][i]

self.t[k][i] = 0

def getRul(self):

self.getMinP()

print('人员依次选择的工作为:',self.path)

print('最短时间为:',self.minP)

if __name__ == '__main__':

p = [[10, 2, 3], [2, 3, 4], [3, 4, 5]]

solu = Solution(p)

solu.getRul()

Python3实现,使用了numpy

# @Time :2018/5/8

# @Author :LiuYinxing

import numpy as np

class Solution:

def __init__(self, p):

self.n = len(p) # 获取n大小

self.minP = float("inf") # 记录最小的 花费

self.tempMinP = 0 # 保存中间值

self.p = p # 人员花费时间表

self.t = np.zeros((self.n, self.n)) # 标记数组全为零,

self.b = 0 # 记录是否已经走完一趟(0 无,1 走完一次)

self.path = [] # 负责记录路径

def getMinP(self, k=0):

if self.b == 1 and self.tempMinP >= self.minP: return # 进行减枝

if k == self.n:

self.b = 1

if self.tempMinP < self.minP:

self.minP = self.tempMinP

self.path = [np.argmax(v)+1 for v in self.t]

return

for i in range(self.n):

if (1 not in self.t[k]) and (1 not in self.t[:,i]): # 判断第k人是否已经分配工作,第i项工作是否已经被分配

self.tempMinP += self.p[k][i] # 添加一个值

self.t[k, i] = 1 # 标记此位置已经走过

self.getMinP(k + 1) # 添加下一个人员

self.tempMinP -= self.p[k][i] # 恢复中间变量

self.t[k, i] = 0 # 恢复位置

def getRul(self):

self.getMinP()

print('人员依次选择的工作为:',self.path)

print('最短时间为:',self.minP)

if __name__ == '__main__':

p = [[10,2,3], [2,3,4], [3,4,5]] # 9

# p = [[50,43,1,58,60], [87,22,5,62,71], [62,98,97,27,38], [56,57,96,73,71], [92,36,43,27,95]]

# p = [[50,43,1,58], [87,22,5,62], [62,98,97,27], [56,57,96,73]]

# p = [[8,6,13,4], [9,5,7,15], [5,2,7,11], [14,12,16,13]]

# p = [[85,45,12,16], [71,59,86,41], [88,45,23,76], [86,78,39,51]]

solu = Solution(p)

solu.getRul()

发现问题,可以留言指教哦。小白一个。

python123.io能不能补交作业_作业分配问题-回溯法-Python3相关推荐

  1. python123.io能不能补交作业_Python学习day1作业总结

    为了以后更好更快速的复习,此博客记录我对作业的总结.对于基础作业,我认为最重要的是过程,至于实现是不是完美,代码是不是完美,虽然重要,但是作业过程中,用到的知识点是值得总结和整理的. 一.模拟登陆: ...

  2. python作业_作业 -- 几道简单的Python题

    1.编写程序,要求生成10240个随机[0,512)之间的整数,并统计每个元素出现的次数. 2.编写程序,要求当用户输入一个列表和两个整数作为下标时,程序可以使用切片获取并输出列表中截取两个下标之间的 ...

  3. python回溯算法_什么是回溯法,Python解法交流?

    只有去多做题,才能慢慢掌握.力扣​leetcode-cn.com LeetCode 上的解释 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就 ...

  4. 回溯 皇后 算法笔记_算法笔记-回溯法

    (1)0-1背包问题 思路:构造一个二叉树,每个商品都有两种状态,要或者不要.如果要就在这个节点的左枝挂子节点,如果不要就在右节点挂子节点.如果全部商品都分配完状态之后就回溯,回溯到一个还有其他选择的 ...

  5. c语言实现判断两个子图是否同构问题_经典问题-回溯法-最大团问题

    1. 知识点 注:用回溯法实现最大团问题和用回溯法实现装载问题,解决方案和复杂度是类似的.如果你对回溯法或者子集树问题,并不了解,可以参看一下这篇文章,里面补充了回溯法和子集树的概念. 装载问题-回溯 ...

  6. python123 第四次作业_第四次作业

    编程作业 这个作业还没做,会尽量想办法抽时间做 c结业的总结 这学期c确实难了很多,我也学的不好,严格来说我c语言一窍不通也没毛病,毕竟关于c语言特性的东西都不咋会我认为原因几下 主观原因:懒,贪玩 ...

  7. python123.io作业_python成长之路-----day1-----作业(登录程序和三级菜单)

    作业: 作业1:用户登录 1)程序说明: a.用户输入密码验证成功然后打印欢迎信息 b.如果密码错误,用户登录失败,提示用户,密码错误 c.用户输入密码错误3次,则用户锁定 d.当用户多次输入不存在的 ...

  8. 计算机会计课程试题及答案,计算机会计第2次作业_报表_附答案

    计算机会计第2次作业_报表_附答案 (6页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 . . . . .<计算机会计>课程作业 ...

  9. 计算机编程导论python程序设计答案-学堂在线_计算机科学与Python编程导论_作业课后答案...

    学堂在线_计算机科学与Python编程导论_作业课后答案 答案: 更多相关问题 近代中国完全沦为半殖民地半封建社会的标志是:A.<马关条约>B.<辛丑条约>C.<凡尔赛和 ...

  10. matlab用lism求零输入响应,信号与系统matlab课后作业_北京交通大学讲解.docx

    信号与系统matlab课后作业_北京交通大学讲解.docx 信号与系统MATLAB平时作业 学院 电子信息工程学院 班级 姓名 学号 教师 钱满义 MATLAB习题 M3-1 一个连续时间LTI系统满 ...

最新文章

  1. shell第一天,添加普通帐号.
  2. 前一个参数作为下个参数结果
  3. thinkphp 引入时间_thinkphp 文章发布日期时间修改问题
  4. mysql 定时器停止_java-MySQL语句取消计时器无法停止
  5. ubuntu 15.10下cmake 的安装
  6. Windows 7 文件夹共享
  7. delphi7aes加密解密与java互转_跨语言(java vs python vs nodejs)的RSA加解密问题探讨
  8. 学徒学计算机,那个有能力的高人愿意收我做学徒啊,我是学计算机的
  9. 利用公式画图_【高中数学】重要公式大汇总!
  10. 前端构建工具与应用程序测试
  11. liunx grep sed
  12. BZOJ 4316: 小C的独立集 仙人掌 + 树形DP
  13. html 中按钮控件变为透明,css如何实现按钮透明
  14. P2562 [AHOI2002]Kitty猫基因编码
  15. 英语语法笔记——冠词
  16. 时域采样与频域采样实验报告_使用网络分析仪进行时域分析
  17. HTML学习笔记——各种居中对齐
  18. Java经典23种设计模式之行为型模式(三)
  19. 某外包程序员吐槽:石乐志,又不是正式工,你拿阿里价值观压我
  20. 油猴脚本hook cookie 生成

热门文章

  1. Spring框架利用PropertyPlaceholderConfigurer初始化加载多properties文件
  2. Linux下安装jdk报Permission denied以及chmod详解
  3. ajax中xmlhttp.readyState==4 xmlhttp.status==200 是什么意思
  4. 25 The Go image/draw package go图片/描绘包:图片/描绘包的基本原理
  5. 如何在多次触发事件时只执行一次?(函数防抖)
  6. JavaSE复习_8 泛型程序设计
  7. git and github secrets
  8. 【D3.V3.js系列教程】--(十五)SVG基本图形绘制
  9. 【Silverlight】Bing Maps学习系列(八):使用Bing Maps Silverlight Control加载自己部署的Google Maps...
  10. 索益Mike的excel商品操作