Cross-posted in MathExchange to elicit more responses。
=============================================== =================================
我在StackOverflow中写了我的原始问题,当时我意识到它被问到before。
事实证明我有一个所谓的子集和问题,所以我去wikipedia找到了这个部分。
The algorithm for the approximate subset sum problem is as follows:
initialize a list S to contain one element 0.
for each i from 1 to N do
let T be a list consisting of xi + y, for all y in S
let U be the union of T and S
sort U
make S empty
let y be the smallest element of U
add y to S
for each element z of U in increasing order do
//trim the list by eliminating numbers close to one another
//and throw out elements greater than s
if y + cs/N < z ≤ s, set y = z and add z to S
if S contains a number between (1 − c)s and s, output yes, otherwise no
但是我在理解用维基百科写的伪代码时遇到了问题。
例如,我认为目标是找到可以匹配S的最接近的数字集。
但是这里是一个清单。这个带有元素0的S列表是什么?
究竟是什么if y + cs/N < z ≤ s
?我怎么用代码写出来呢?
我希望有人可以帮我翻译成php代码。
至少我对此更为熟悉。它不一定是完整的翻译。
只要答案让我理解这个近似算法足以让我自己用PHP代码编写,那就可以了。
答案 0 :(得分:3)
回答您在math.stackexchange.com上逐一发布的子问题:
大S
和小s
之间有什么区别?大S
是一个列表变量,最初是列表{{1并且在代码执行过程中被修改。小[0]
是一个保持不变的数字。具体来说,s
是此问题的数字:
给定一组整数和一个整数 s ,是否有任何非空子集加到 s ?
但 s
是什么?粗略地说,S
表示我们可以使用的所有“有用”总和的集合到目前为止我们看到的元素(如果我没有记错的话)。
“包含元素0的列表”是否表示包含单个数字的列表,该数字为零?是的,这就是这个意思。
S
的含义是什么?这意味着y + cs/N < z ≤ s
和y + c*s/N < z
。因此,只要z ≤ s
或 if
(或两者),y + c*s/N ≥ z
就会失败。
有些问题你没有问,但似乎有可能出现:
什么是z > s
? N
是我们给出的集合中的元素数量。
什么是N
? xi
是我们给出的集合中的 i -th元素。