我正在寻找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;
}
答案 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;
}