diff --git a/dynamic_programming/bitmask.py b/dynamic_programming/bitmask.py new file mode 100644 index 000000000..213b22fe9 --- /dev/null +++ b/dynamic_programming/bitmask.py @@ -0,0 +1,90 @@ +""" + +This is a python implementation for questions involving task assignments between people. +Here Bitmasking and DP are used for solving this. + +Question :- +We have N tasks and M people. Each person in M can do only certain of these tasks. Also a person can do only one task and a task is performed only by one person. +Find the total no of ways in which the tasks can be distributed. + + +""" +from __future__ import print_function +from collections import defaultdict + + +class AssignmentUsingBitmask: + def __init__(self,task_performed,total): + + self.total_tasks = total #total no of tasks (N) + + # DP table will have a dimension of (2^M)*N + # initially all values are set to -1 + self.dp = [[-1 for i in range(total+1)] for j in range(2**len(task_performed))] + + self.task = defaultdict(list) #stores the list of persons for each task + + #finalmask is used to check if all persons are included by setting all bits to 1 + self.finalmask = (1< self.total_tasks: + return 0 + + #if case already considered + if self.dp[mask][taskno]!=-1: + return self.dp[mask][taskno] + + # Number of ways when we dont this task in the arrangement + total_ways_util = self.CountWaysUtil(mask,taskno+1) + + # now assign the tasks one by one to all possible persons and recursively assign for the remaining tasks. + if taskno in self.task: + for p in self.task[taskno]: + + # if p is already given a task + if mask & (1<