【问题标题】:Explain this subset sum solving function [duplicate]解释这个子集和求解函数[重复]
【发布时间】: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


【解决方案1】:

不知何故,您问题中的代码是实现此算法的 (my1) answer 的精确副本。我同意算法本身并不新,但代码的结构和变量都表明正在复制。如果您仔细阅读了问题(和答案),您可能会发现正在解决的问题是最接近子集和问题。这意味着如果无法构造这样的集合,则返回差异最小的集合。

现在,由于这样的集合可以大于请求的总和,您最多需要 2 K+1 个集合,其中 K 是请求的数量,因为您的集合中的最小数字可能是 K-1。例如,假设给定数字是{2,5,8,10},并且您希望构造6 的子集,而不是最近的子集总和是{2,5}。您需要足够的“集合”来存储可能更大的子集。

循环中发生的事情在链接的答案中进行了解释。

1谁写的答案无关紧要,但是更容易检测到你自己的工作。

【讨论】:

  • 我其实不知道,我只是在看朋友代码
  • @user3621898:好的。我修改了语句,使它更柔和一些。然而,简单地从 SO 复制至少是相当粗鲁。顺便说一句,我没有回答你的问题。
  • @CommuSoft 您可以考虑更新您的原始解释(如果您觉得需要更多信息) - 我已将这篇文章复制为您的原始答案。
  • @AlexeiLevenkov:是的,我会更新它,需要一些时间。
  • @user3621898 您的朋友未提供适当的归属 (creativecommons.org/licenses/by-sa/3.0) 显然违反了 SO 使用的许可,这反过来又可以极大地帮助您理解代码...
猜你喜欢
  • 1970-01-01
  • 2015-08-04
  • 2011-03-02
  • 1970-01-01
  • 2015-03-16
  • 2017-01-03
  • 2015-03-28
  • 1970-01-01
  • 2021-06-21
相关资源
最近更新 更多