动态编程:最大化

时间:2018-04-13 00:40:18

标签: algorithm optimization language-agnostic dynamic-programming

在招聘会上,我被问到以下棘手的问题(不完全如下,我删除了故事并正式表达了问题(或多或少)。

  

给定数字K和有限的对L = < (a,b), (c,d), (e,f) >列表,其中每对p由两个数字n1n2组成。   找到列表R,其中包含所有值n1的总和   对是其对的所有n2值的最大值和总和   小于或等于K。在列表R中,对可以重复。

例如,如果您的K为10,并且您将L对列表作为<(3,2) , (1,7), (4,6) >,则结果将为R = < (3,2), (3,2), (3,2), (3,2), (3,2) >,以便所有n1值均为3 + 3 + 3 + 3 + 3 = 15,所有n2值的总和为2 + 2 + 2 + 2 + 2 = 10。这是正确的解决方案,而不是<(3,2), (3,2), (4,6)>n1和为10; n2和为10)或类似<(1,7), (3,2)>n1和为4 ; n2 sum是9)其n1总和不是最大可能。

我描述了一种方法,其中我将基本上枚举所有可能的对的组合,其n2值将总和小于或等于K,并选择具有最高n1和的组合。枚举可以通过从K中逐步减去给定列表n2中的每个L值来完成。

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

这是“无界背包问题”。这是NP难,所以没有(已知的)多项式解,但是如果n2和K是整数,则有一个已知的伪多项式时间解,你可以在这里找到:https://en.wikipedia.org/wiki/Knapsack_problem#Solving

上述动态编程解决方案是针对每个容量k计算0 <= k <= K,并且对于列表L的每个前缀,计算sum(n1)的最大值,使得和(n2)&lt; = k。

答案 1 :(得分:0)

我认为,重要的见解是要注意关键因素是两个数字的比率,而不是它们的差异。 n2是您的预算; n1是每个项目的费用,n1/n2是其值。您需要在给定预算范围内最大化价值。

res <- rma(as.numeric(effect_size),as.numeric(nonCI_uncertainty_value), data=subsetted3.data, method="DL") par(mfrow=c(2,2)) funnel(res, xlab = "Effect Size", main="Standard Error") + title(sub = paste0(val2," in units of : ", val3), cex.sub = 0.75, font.sub = 3) 比率降序排列。应用规范递归程序(参见广义&#34;进行更改&#34;问题)来探索解决方案空间。如果它更容易,仅按n2降序排序;这将使其与硬币问题的实施更加匹配,但代价是更多地寻找最佳解决方案。

请注意,您可以通过两种方式修剪递归:

  1. 其余对的比率太低,无法超过当前的最佳解决方案。
  2. 下一对平均分配剩余预算:使用按比例排序的列表,必须才是最佳解决方案。
  3. 这是否足以让你脱离困境?

相关问题