【发布时间】:2015-12-14 20:04:08
【问题描述】:
这段代码是解决子集和问题变体的函数,但我不太明白它是如何得到答案的。
该函数返回最接近该值的子集和,如果它与该值相同,则它只返回该值,如果两个子集和同样接近该值,则返回较大的和。
就是这样
public static List<int> SolveSubsetSum(int value, IEnumerable<int> xs)
{
int b = 2*value+1;
List<int>[] cols = new List<int>[b];
cols[0] = new List<int>();
foreach(int xi in xs) {
for(int s = b-xi-1; s >= 0; s--) {
if(cols[s+xi] == null && cols[s] != null) {
List<int> cln = new List<int>(cols[s]);
cln.Add(xi);
cols[s+xi] = cln;
}
}
}
for(int d = 0; d <= value; d++) {
if(cols[value+d] != null) {
return cols[value+d];
}
else if(cols[value-d] != null) {
return cols[value-d];
}
}
return cols[0];
}
我了解标准内容,但我不知道循环中发生了什么。
我的主要问题是
为什么需要
2*value+1集合的数组?循环中发生了什么?
【问题讨论】:
-
我认为你能理解的最好方法是一步一步调试,看看这段代码在做什么,这就是你学习编码的方式
-
虽然不链接肯定是粗鲁的,但我认为声称用户将这段代码作为自己的代码传递是不合理的,因为他们明确表示他们不理解它。对于抄袭,问题必须声明或强烈暗示代码是作者自己的。 dictionary.reference.com/browse/plagiarism
-
@MichaelBlackburn:好的没问题,但是快速阅读问题和答案应该可以解决问题,你不觉得吗?
标签: c# algorithm subset-sum