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