分配问题
求和分配问题
求和分配问题是这样的,给定n个正整数a1,…,an。之后要将所有元素划分到两个集合A,B中,要求A中元素总和减去B中元素总和正好等于T,其中T是提前指定的数。
求和分配问题还有一种形式,就是将所有元素划分到三个集合A,B,C中,要求A中元素总和减去B中元素总和正好等于T,其中T是提前指定的数。这种形式相当于允许我们不考虑一部分的元素。
分成两个集合的求和分配问题的一般解法是,首先将所有数分配到集合B中,之后我们不断将元素从集合B中移动到集合A中。可以发现现在我们移动元素i,总和会增加2ai。而我们希望总和提高的量正好达到∑ni=1ai+T。现在问题变成了,有大小为a1,…,an的n块石头,以及容量正好为(∑ni=1ai+T)/2的背包,问是否可能选择一部分石头正好装满背包。
而对于分成三个集合的形式,相当于第i个物品的价值可能是ai,也可能是2ai。
题目1:解决分成两个集合的求和分配问题,这里特殊的每个ai都是2的幂次。要求回答当T=t1,…,tm的时候是否有解,其中1≤n,m≤106。
考虑转换过的问题,我们现在用一堆2的幂次,来组合一个给定的数。这个问题可以直接从低位向高位枚举,贪心解决,时间复杂度为O(mlog2M+n)。
题目2:解决分成三个集合的求和分配问题,这里特殊的每个ai都是2的幂次。要求回答当T=t1,…,tm的时候是否有解,其中1≤n,m≤106。
类似题目1,这次我们在枚举的时候优先让球变成2ai,如果不行才作为ai使用,贪心解决。时间复杂度为O(mlog2M+n)。