下面的代码是我试图在回溯算法中构建0-1背包问题的代码,我尝试运行和调试了很多次,但是仍然出现错误:EXC_BAD_ACCESS(code = EXC_I386_GPFLT)在“ if( w [I]> = W)”。 请让我知道错误是什么,我非常感谢任何评论。 谢谢。
这是代码:
bool promissing(int i, int profit, int weight, int n, int w[], int p[], int W, int maxProfit) { int j,k, totweight; double bound; //if weight is greater than W -> the bag can't hold the item we just took // -> return False if(w[i] >= W) { return false; } else { j = i + 1; bound = p[i]; totweight = w[i]; //Grab as many item as possible (not breaking the bag) while (j <= n && totweight + w[j] <= W) { totweight = totweight + w[j]; bound = bound + p[j]; j++; } k = j; if(k <= n) { bound = bound + (W - totweight) * p[k]/w[k]; //grab part of k item that can be fit in the bag } } return bound > maxProfit;
}
void knapsack_backtracking(int i, int profit, int weight, int n, int p[], int w[], int W, int maxProfit) { //int maxProfit = 0; int bestSet[] = {}; int include[] = {}; int numBest; //update maxProfit if (weight <= W && profit > maxProfit) { maxProfit = profit; numBest = i; //bestset = include; for(int m = 0; m < n; m++) { bestSet[m] = include[m]; } } if(promissing(i, profit ,weight , n , w, p, W, maxProfit)) { include[i + 1] = 1; //steal item i+1 knapsack_backtracking(i+1, profit + p[i], weight + w[i], n, p, w, W, maxProfit); include[i + 1] = 0; //reject item i + 1 knapsack_backtracking(i+1, profit, weight,n,p,w,W, maxProfit); }
}