查找带有回溯的数字组合

Posted

技术标签:

【中文标题】查找带有回溯的数字组合【英文标题】:Find combination of numbers with backtrack 【发布时间】:2014-04-25 16:50:11 【问题描述】:

我正在寻找 C# 中的回溯算法,该算法将从 List<int> 中搜索正确的数字,其中这些数字的总和最接近 X。


例如:list=5,1,3,5, X = 10 输出应该是 (5,5) (5+5 最接近 10) 它不能是 (3,3,3,1),因为我不能多次使用来自 List 的数字。 (如果我们有 3 号的两块,我们可以使用两次)

例如 2:list=4,1,3,4, X=10 输出应该是 4,1,3 和 1,3,4。

我得到了这种代码来启动,但我做不到; (我知道有关于回溯和背包的***,但这对我没有帮助)

static void BackTrack(int lvl, bool Van, int[] E)

   int i = -1;
   do
   
      i++;
      if (ft(lvl, i))
      
         int k = 0;
         while (k < szint && fk(E[i], E[k]))
         
            k++;
         
         if (k == szint)
         
            E[k] = R[lvl,i];
            if (lvl == E.Length - 1)
            
            
            else
            
               BackTrack(lvl + 1, Van, E);
            
         
      
    
   while (i < E.Length - 1);


static bool fk(int nr, int nr2)

   return (nr + nr2 <= 10);


static bool ft(int lvl, int nr)

   return true;

【问题讨论】:

【参考方案1】:

从我正在阅读的内容来看,这个例子:

例如 2:list=4,1,3,4, X=10 输出应该是 4,1,3 和 1,3,4。

输出应该是 4,1,4 9 比 8 更接近。

这就是我所做的。它适用于您提供的两个示例。

public List<int> highest(List<int> list, int number)
    
        //probably a better way to do this
        IEnumerable<int> orderedList = list.OrderByDescending(item => item);

        var currentNumber = 0;
        List<int> combinationResult = new List<int>();
        foreach (var item in orderedList)
        
            var temp = currentNumber + item;
            if (temp <= number)
            
                combinationResult.Add(item);
                currentNumber = temp;
            
        
        return combinationResult;
    

【讨论】:

我刚刚看到,它给出了正确的数字,但我需要回溯:( 回溯是什么意思? 用递归算法找到没有排序的数字。 link

以上是关于查找带有回溯的数字组合的主要内容,如果未能解决你的问题,请参考以下文章

子集总和,带有回溯和类

LeetCode-回溯组合总和

39. 组合总和回溯Normal

递归与回溯:python列表组合问题

leetcode 77. Combinations 组合(中等)

216. 组合总和 IIINormal回溯