在招聘会上,我被问到以下棘手的问题(不完全如下,我删除了故事并正式表达了问题(或多或少)。
给定数字
K
和有限的对L = < (a,b), (c,d), (e,f) >
列表,其中每对p
由两个数字n1
和n2
组成。 找到列表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
值来完成。
有更好的方法吗?
答案 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降序排序;这将使其与硬币问题的实施更加匹配,但代价是更多地寻找最佳解决方案。
请注意,您可以通过两种方式修剪递归:
这是否足以让你脱离困境?