嘿伙计们,最近发布了关于我的算法的问题。
我稍微修改了代码,所以它现在在一定程度上回溯了,但是输出仍然有缺陷。我已经调试了这个相当检查所有变量值,但似乎无法找出问题所在。
再次建议而不是彻底的解决方案将有很大帮助。我认为我的代码只有几个问题,但我不知道在哪里。
//来自上一篇文章:
基本上,一个集合被传递给下面的这个方法,并且一个条的长度也被传递。如果从条长度中删除集合中的某些数字,则解决方案应该输出集合中的数字,这些数字给出的浪费最少。所以,条长 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;
}
}