【问题标题】:how to find best element in bag in knapsack如何在背包的包中找到最佳元素
【发布时间】:2015-03-26 18:59:23
【问题描述】:

如何在 C# 递归模式下的背包问题中找到包中最好的物品?

我试图收集函数为它们返回更大值的索引,但我似乎没有工作....

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]);
    }
}

【问题讨论】:

  • 最好的元素是什么意思?背包问题是 NP 难题,因此计算最佳元素需要回溯算法。
  • 假设我有 10 件物品,我计算出最大的收益.....我怎样才能找到小偷应该带走的物品?
  • 你能展示你目前拥有的代码吗?
  • @alinajimi:如果小偷只能拿一个元素,你应该遍历项目列表,检查小偷是否可以挑选它们,如果可以,取最大值的那个.. .
  • @radio static int recursiveknapsnack(int i,int W) { if (i W) { return recursiveknapsnack(i - 1, W); } else { return Math.Max(recursiveknapsnack(i - 1, W),recursiveknapsnack(i - 1, W - wt[i]) + val[i]); } }

标签: c# algorithm knapsack-problem


【解决方案1】:

当然,这取决于您要解决的背包问题,但如果是默认问题,您应该将 weight 方面与 value 方面分开,因此:

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

【讨论】:

  • 感谢您的回复....但我仍然没有得到小偷应该带走的物品的方法?我应该如何更改代码?
  • @alinajimi:啊你不要最大值,而是自己计算包?
猜你喜欢
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 2014-12-16
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
相关资源
最近更新 更多