【发布时间】:2017-10-10 04:04:14
【问题描述】:
public static int n;
public static int w;
public static int[] s;
public static int[] p;
static void Main(string[] args)
{
n = 5;
w = 5;
s = new int[n + 1];
p = new int[n + 1];
Random rnd = new Random();
for (int i = 1; i <= n; i++)
{
s[i] = rnd.Next(1, 10);
p[i] = rnd.Next(1, 10);
}
Console.WriteLine(F_recursion(n, w));
Console.WriteLine(DP(n, w));
}
// recursive approach
public static int F_recursion(int n, int w)
{
if (n == 0 || w == 0)
return 0;
else if (s[n] > w)
return F_recursion(n - 1, w);
else
{
return Math.Max(F_recursion(n - 1, w), (p[n] + F_recursion(n - 1, w - s[n])));
}
}
// iterative approach
public static int DP(int n, int w)
{
int result = 0;
for (int i = 1; i <= n; i++)
{
if (s[i] > w)
{
continue;
}
else
{
result += p[i];
w = w - s[i];
}
}
return result;
}
我需要将 F_recursion 函数转换为迭代。我目前编写了以下功能 DP,该功能有时有效,但并非总是如此。我了解到问题出在 F_recursion(n - 1, w - s[n]) 我不知道如何使 w - s[n] 在迭代解决方案中正常工作。如果将 w - s[n] 和 w - s[i] 更改为仅 w,则程序始终可以工作。
在控制台中:
s[i] = 2 p[i] = 3
-------
s[i] = 3 p[i] = 4
-------
s[i] = 5 p[i] = 3
-------
s[i] = 3 p[i] = 8
-------
s[i] = 6 p[i] = 6
-------
Recursive:11
Iteration:7
但有时它会起作用
s[i] = 5 p[i] = 6
-------
s[i] = 8 p[i] = 1
-------
s[i] = 3 p[i] = 5
-------
s[i] = 3 p[i] = 1
-------
s[i] = 7 p[i] = 7
-------
Recursive:6
Iteration:6
【问题讨论】:
-
定义“有时有效,但不总是”。
-
添加了我多次运行程序后得到的结果。
-
好的,太好了......现在这些数字是什么意思?你的递归方法实际上是做什么的?
-
方法是递归关系,我将其转换为递归版本,效果很好,但我不知道如何将其转换为迭代版本。 s, p 只是我存储随机数的数组。
-
这就是它的本质,而不是它的作用。无论如何,您的迭代方法看起来不像您的递归方法。你没有检查
w的值,没有调用Math.Max,我看不出它会如何复制可能的分支递归。据我所知,您已经实现了足够多的迭代方法,以便仅在非常特殊的输入类型上复制递归方法。
标签: c# dynamic-programming memoization