(动机:考虑一个问题,你必须从一群可用的球员中选择一支运动队。每位球员都有一定的技能水平与他们的薪水期望成正比,你想要这个技能/薪水水平的总和。完全符合你的工资总额上限。)
我需要编写以下函数:
bool possibleAssignment(int N, int M, int T, vector<int> H);
输入限制是:
0 < N <= 50
0 < M <= 50
0 < T <= 2500
H.size() == N + 1
i
,0 <= H[i] <= M
possibleAssign返回true:
i
,0 <= X[i] <= N
v
,值X
的{{1}}元素数量为&lt; = H [v] 我可以通过什么算法或方法实现possibleAssign?
答案 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
分配的最大数量的元素