Wizmann / ACM-ICPC

感觉自己做了假题。
http://wizmann.tk
Other
63 stars 29 forks source link

Leetcode 1655. Distribute Repeating Integers #85

Open Wizmann opened 3 years ago

Wizmann commented 3 years ago

题意

Problem

给你M种(M <= 50)互不相同的数,每个数有q[i]个。

现在有N(N <= 10)个人,每个人需要r[i]个相同的数。

问是否能满足所有人的要求。

解法

小结论:只需要前N种数量最多的数即可。

暴力解法1

将M种数从多到少排列。将N个人的需求全排列,进行匹配。

时间复杂度O(N! * N)

暴力解法2

DFS搜索。时间复杂度同1类似,剪枝到位的话会快很多。

正常解法

将M种数从多到少排列。将N个人的需求从多到少排列。

假设前K种数能满足N个人中某个子集B的需求。

我们向这个子集中加入一个人,形成了个新的集合B1 = B | (1 << t)。设B1的子集B1A ^ B1B = B1,我们可以判断B1集合的子集B1A是否能被前K - 1种数满足,然后将剩下的子集B1B被第K种数满足。

使用DP的方法即可求解。