我试图解决ACM问题集中的一些问题。我偶然发现了一件对我来说太难的事情。
详细信息:http://www.karrels.org/Ed/ACM/93/prob_g.html
对我来说,看起来我们有篮子(每个分区一个篮子)和每个篮子中的一组可能选项(每个可能分配一个选项)。每个可能的选项就像带有两个参数(钱和程序员)的背包项目。两个参数分别限于值b和p。
请告诉我如何解决这个问题。
答案 0 :(得分:0)
对我来说看起来像是一个动态编程问题。基本上,您希望按顺序接近每个部门:为已经考虑的部门维护一组最佳可用解决方案,然后逐个添加剩余部门。
具体来说:您可以将两个选项矩阵(如每个部门所述)组合成一个组合选项矩阵。该矩阵的行和列都是原始矩阵的行和列的所有可能的总和,并且支付条目是原始矩阵中的支付的总和。请注意,行和列可能重叠(如果两个总和最终相同);在这种情况下,你显然想要使用最大的回报。此外,您还需要存储每次收益的实现方式,以便最终报告如何实现最佳解决方案。
注意,如果原始矩阵的大小是A和B,则在最坏的情况下,得到的矩阵的大小可以是O(A * B)。但是,您不需要存储任何大于总可用资源的行或列。此外,如前所述,如果有多种方法可以达到该总和,则会合并行和列。最后,我相信你可以放弃任何矩阵条目,其收益并不比需要更少资源的其他矩阵条目更好;得到的稀疏矩阵可能需要更少的空间和计算来处理。
在任何情况下,一旦您将所有部门合并为一个最终矩阵,请将最大的支付条目报告为您的解决方案。