查找带有回溯的数字组合

时间:2014-04-25 16:50:12

标签: c# sum backtracking knapsack-problem

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


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

例如: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 个答案:

答案 0 :(得分:1)

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

例如: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;
    }