【发布时间】:2021-07-04 09:27:42
【问题描述】:
我有这个算法:
static int findMaxRec(int[] w, int[] v, int W, int n)
{
int max = int.MinValue;
int res;
for (int i = 0; i < n; i++)
{
if (w[i] <= W)
{
if (w[i] == W)
res = v[i]; // F(0) + v[i] = v[i]
else
res = findMaxRec(w, v, W - w[i], n) + v[i];
max = max < res ? res : max;
}
}
return max;
}
如何将其转换为动态规划算法? 我尝试了几个想法,但似乎没有一个可行。所以我被卡住了。
附: w 和 v 只是简单的数字数组,没什么特别的。 W 只是一个数字。这个算法没有实现任何特定的任务,我刚刚在一本书中找到了它,他们要求为给定的公式实现算法。
更新:
static int findMaxDyn(int[] F, int[] w, int[] v, int W, int n)
{
int max = int.MinValue;
int res;
for (int i = 0; i < n; i++)
{
if (w[i] <= W)
{
if (F[W - w[i]] == int.MinValue) // calculate only if -inf
{
if (w[i] == W)
res = v[i]; // F(0) + v[i] = v[i]
else
res = findMaxDyn(F, w, v, W - w[i], n) + v[i];
max = max < res ? res : max;
F[W - w[i]] = max;
}
}
}
return max;
}
这给出了与递归算法不匹配的错误答案。而且好像还在用递归……
我在什么时候画的递归树
int [] w = new []{ 4, 3, 2, 1};
int [] v = new []{ 4, 3, 2, 1};
int W = 4;
int n = 4;
【问题讨论】:
-
你试过什么?这次尝试具体出了什么问题?作为旁注,您可能希望选择更好的变量名称以使事情变得更容易。
-
这个算法解决了什么问题?
-
虽然您是对的,但前面的注释以解释变量名称的注释开头,例如
// Input: // Values (stored in array v) // Weights (stored in array w) // Number of distinct items (n) // Knapsack capacity (W)没有任何关于命名变量名称的评论必须为自己说话。 -
@Fildor 是的,但题外话。
-
如上所述,您似乎试图解决的问题被称为“背包问题”。您可能对此感兴趣:stackoverflow.com/a/50395293/10608418
标签: c# recursion dynamic-programming recursion-schemes