如何在背包里找到最好的元素

时间:2015-03-26 18:59:24

标签: c# algorithm knapsack-problem

如何使用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]);
    }
}

1 个答案:

答案 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));
        }
    }