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
"때때로 작동하지만 항상은 아니지만"을 정의하십시오. – Abion47
프로그램을 여러 번 실행 한 후 어떤 결과가 나옵니까? – Simas
좋아, 좋아 ... 지금이 숫자들은 무엇을 의미합니까? 재귀 적 방법은 실제로 무엇을합니까? – Abion47