任务分配问题:
是排列树,考虑到用全排列的方式较难实现,考虑用n叉树
Hashset用来维护每个分支之前的任务分配情况,如果此任务已被分配,就不再分配,(加入set失败),此时查找任务的效率是O(1),效率比数组高,对于每一个出队的节点,如果不是叶子节点,就继续扩展子节点,如果是叶子,求此分配形式的花费与最优花费比较,谁小保留谁,扩展子节点时,先得到父节点的set信息,用for循环依次把第i个任务分配给子节点,利用是否可以加入set,判断此任务有没有被分配,若已被分配,剪枝,否则,计算此时对应的最小下界,如果小于最小花费,剪枝(不再扩展),否则,入队。时间复杂度为时间复杂度为n的(n+1)次方,因为对每个节点考虑分配n个任务,每次查找花费o(1),对于每一个节点计算最小花费需要O(n)
import java.util.Comparator;
impo