利用位屏蔽和动态规划解决问题 Bitmasking & Dynamic Programming
位屏蔽基础
上一篇简单介绍了位屏蔽的赋值操作,在解决问题之前,再介绍一下位屏蔽的去值操作以及检查操作。
去值操作:
b & !(1 << i)
例子:
取i = 1, (1 << i) = 00010
!(1 << i) = 11101 (每位取反)
b = 01010
b & !(1 << i) = 01010 & 11101 = 01000 (1位上的值已经去除)
检查操作:
b & (1 << i)
例子:
取i = 1, (1 << i) = 00010
b = 01010
b & (1 << i) = 01010 & 00010 = 00010 (结果不为0) 则检查位上有值,即子级中包含检查的值。
利用位屏蔽和动态规划解决问题
题目:
需要给N个人分配总共N个任务,每个人完成一个任务,并且给出一个 N x N 的矩阵,cost[i][j] 代表第i个人完成第j个任务的代价。现在我们要找出分配任务代价最小的方案。
暴力解法:
assign(N, cost)
for i = 0 to N
assignment[i