如何在背包的包中找到最佳元素
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生成的包中?