嗨,大家好,最近发布了关于我的算法的问题。递归回溯问题
Finding the numbers from a set which give the minimum amount of waste
伊夫修正代码略,所以现在回溯到一定程度,然而,输出仍存在缺陷。我调试了这大幅检查所有的变量值,似乎无法找出问题。
再次建议,而不是一个彻底的解决方案将有很大的帮助。我认为我的代码只有几个问题,但我无法解决问题。
从以前的帖子//:
基本上是一组被传递到低于该方法和条的长度也被所述的溶液通过应输出从所述一组这给的最小量的数字。如果集合中的某些数字从长度上移除,则浪费。因此,条的长度为10,集合包括6,1,4,所以解决方案是6和4,浪费是0.我有一些麻烦的情况下回溯集。我也尝试使用浪费的“全局”变量来帮助回溯方面,但无济于事。
SetInt是一个手工制作的集合实现,它可以添加,删除,检查集合是否为空并返回集合中的最小值。
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package recursivebacktracking;
/**
*
* @author User
*/
public class RecBack {
int WASTAGE = 10;
int BESTWASTAGE;
int BARLENGTH = 10;
public void work()
{
int[] nums = {6,1,2,5};
//Order Numbers
SetInt ORDERS = new SetInt(nums.length);
SetInt BESTSET = new SetInt(nums.length);
SetInt SOLUTION = new SetInt(nums.length);
//Set Declarration
for (int item : nums)ORDERS.add(item);
//Populate Set
SetInt result = tryCutting(ORDERS, SOLUTION, BARLENGTH, WASTAGE);
result.printNumbers();
}
public SetInt tryCutting(SetInt possibleOrders, SetInt solution, int lengthleft, int waste)
{
for (int i = 0; i < possibleOrders.numberInSet(); i++) // the repeat
{
int a = possibleOrders.min(); //select next candidate
System.out.println(a);
if (a <= lengthleft) //if accecptable
{
solution.add(a); //record candidate
lengthleft -= a;
WASTAGE = lengthleft;
possibleOrders.remove(a); //remove from original set
if (!possibleOrders.isEmpty()) //solution not complete
{
System.out.println("this time");
tryCutting(possibleOrders, solution, lengthleft, waste);//try recursive call
BESTWASTAGE = WASTAGE;
if (BESTWASTAGE <= WASTAGE)//if not successfull
{
lengthleft += a;
solution.remove(a);
System.out.println("never happens");
}
} //solution not complete
}
} //for loop
return solution;
}
}
调试时总是回到递归调用后的那一行,其中我设置了BESTWASTAGE = WASTAGE。这可能会导致问题,如果是的话,哪里是最好的地方来设置它? – Newb 2011-04-21 01:10:14