用于查找数字集合的算法是否可以加起来X,具有约束直方图

时间:2012-07-03 12:24:29

标签: algorithm math

(动机:考虑一个问题,你必须从一群可用的球员中选择一支运动队。每位球员都有一定的技能水平与他们的薪水期望成正比,你想要这个技能/薪水水平的总和。完全符合你的工资总额上限。)

我需要编写以下函数:

 bool possibleAssignment(int N, int M, int T, vector<int> H);

输入限制是:

  • 0 < N <= 50
  • 0 < M <= 50
  • 0 < T <= 2500
  • H.size() == N + 1
  • Forall i0 <= H[i] <= M
如果可以使用以下三个约束分配M个int的数组X,则

possibleAssign返回true:

  1. Forall i0 <= X[i] <= N
  2. Forall v,值X的{​​{1}}元素数量为&lt; = H [v]
  3. X的总和为T
  4. 我可以通过什么算法或方法实现possibleAssign?

1 个答案:

答案 0 :(得分:3)

这个问题似乎可以从Subset Sum Problem中减少,或者更为人所知的变体:knapsack problem,它们是NP-Hard,因此没有已知的多项式解决方案。

然而,似乎T足够小,幸运的是,使用DP的问题存在pseudo polynomial solution

因为问题已经类似于背包问题,我会尝试减少问题以适应背包问题,然后调用DP算法找到背包问题的最佳解决方案:

我首先过滤列表,只保留值为v的H [v]元素。现在,按如下方式设置元素:

value(x) = 1
weight(x) = x
Bag size = T

这将让你前进 - 为你提供可以用工资约束T

分配的最大数量的元素