将数组划分为相同和值的K个子集

时间:2017-05-11 19:20:54

标签: java algorithm subset

试图找出以下问题:

  

给定N个正整数的集合S,任务是将它们划分为K个子集,使得每个K个子集中的元素值之和相等。

我希望使用一组不超过10个整数的值,值不大于10且小于5个子集。 所有整数都需要分布,并且只接受完美的解决方案(意味着所有子集都相等,没有近似值)。 我希望使用回溯递归地解决它。我在网上找到的大多数资源都使用了我不理解的其他方法,使用了位掩码或其他方法,或仅用于两个子集而不是K个子集。

我的第一个想法是

  1. 按升序对集合进行排序,检查所有基本情况(例如,无法进行均匀分布),计算所有子集必须具有的平均值,以便所有子集都相等。
  2. 遍历每个子集,填充每个子集(首先从最大值开始),直到达到该平均值(意味着它们已满)。
  3. 如果无法满足子集的平均值(未分配的值太大等),返回并尝试上一个子集的其他组合
  4. 如果遇到死胡同,请继续往返。
  5. 在遇到所有死角或找到完美解决方案时停止。
  6. 不幸的是,我真的在努力解决这个问题,尤其是在实施回溯并重新尝试新组合时。

    感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

给定集合:具有N个元素的S具有2 ^ N个子集。 (在此详细解释:https://www.mathsisfun.com/activity/subsets.html)分区是将集合的元素分组为非空子集,这样每个元素都包含在一个且只有一个子集中。 n元素集的partitions总数是贝尔数Bn。

可以按如下方式实现此问题的解决方案:

1)创建集合S的所有可能partitions,称为P(S)。

2)循环P(S)并滤除每个子集中元素值的总和不匹配。