嗨,大家好,最近發佈了關於我的算法的問題。遞歸回溯問題
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