如何使用C#以递归模式在KNAPSACK问题中找到包中的最佳项目?
我试图收集哪些函数为它们返回更大值的索引,但我似乎没有工作....
static int recursiveknapsnack(int i,int W) {
if (i < 0) {
return 0;
} else if (wt[i] > W) {
return recursiveknapsnack(i - 1, W);
} else {
return Math.Max(recursiveknapsnack(i-1, W),recursiveknapsnack(i-1,W - wt[i])+val[i]);
}
}
答案 0 :(得分:0)
当然这取决于你想要解决的背包问题,但如果它是默认的,你应该将权重方面与值 - 方面分开,因此:
static int recursiveknapsnack(int i,int W, int v) {
if (i < 0 || w <= 0) {
return v;
} else if (wt[i] > W) {
return recursiveknapsnack(i-1,W,v);
} else {
return Math.Max(recursiveknapsnack(i-1,W,v),recursiveknapsnack(i-1,W- wt[i],v+val[i]));
}
}
并将其命名为:
recursiveKnapsack(n,W,0);
n
项目数量和W
背包总容量。
但是请注意,这种递归算法远非最优。 背包问题是伪多项式使用动态编程方法,可以实现更有效的算法。
编辑:如果您想要计算行李而不是最大值本身,您可以存储最佳值和行李:
int[] wt;//the weights
int[] val;//the values
static bool[] solveKnapsack (int W) {
int n = wt.length;
bool[] knapsack = new bool[n];
bool[] opt = null;
int vopt = 0;
recursiveknapsnack(n-1,W,0,knapsack,ref vopt,ref opt);
return opt;
}
static void recursiveknapsnack(int i, int W, int v, bool[] knapsack, ref int vopt, ref bool[] kopt) {
if (i < 0 || w <= 0) {
if(v > vopt) {
vopt = v;
kopt = (bool[]) knapsack.Clone();
}
} else if (wt[i] > W) {
return recursiveknapsnack(i-1,W,v);
} else {
return Math.Max(recursiveknapsnack(i-1,W,v,ref vopt, ref kopt),recursiveknapsnack(i-1,W-wt[i],v+val[i],ref vopt,ref kopt));
}
}