如何在背包的包中找到最佳元素

Posted

技术标签:

【中文标题】如何在背包的包中找到最佳元素【英文标题】: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]); 【参考方案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:啊你不要最大值,而是自己计算包?

以上是关于如何在背包的包中找到最佳元素的主要内容,如果未能解决你的问题,请参考以下文章

你如何告诉 CMake 静态链接到使用 find_package 找到的包中的库?

如何将所有3rdparty运行时依赖项包含在linux上的cmake / cpack生成的包中?

如何从用户定义的包中正确导入宏?

如何在 Eclipse 上的包中制作子包?

如何在子类中访问超类的“受保护的静态”变量,子类位于不同的包中......?

如何启动在与小部件不同的包中定义的活动?