http://blog.youkuaiyun.com/huxin2007/archive/2006/09/28/1302156.aspx
递归
-----------------------------------------------------------------------------------------------------
斐波纳契数(递归实现)不可行
int F(int
i)
...
{
if(i < 1) return 0;
if(i == 1) return 1;
return F(i-1) + F(i-2);
}
-----------------------------------------------------------------------------------------------------
斐波纳契数(动态规划)
int F(int
i)
...
{
int t;
if(knownF[i] != unknown) return knownF[i];
if(i == 0) t = 0;
if(i == 1) t = 1;
if(i > 1) t = F(i-1) + F(i-2);
return (knownF[i] = t);
}
-----------------------------------------------------------------------------------------------------
背包问题(递归实现)不可行
typedef struct

...
{
int size;
int val;
}
Item;
Item items[N];
int knap(int
cap)
...
{
int i, space, max, t;
for(i = 0, max = 0; i < N; i++)
...{
if((space = cap - items[i].size) >= 0)
if((t = knap(space) + items[i].val) > max)
max = t;
}
return max;
}

-----------------------------------------------------------------------------------------------------
背包问题(动态规划)
int knap(int
cap)
...
{
int i, space, max, maxi, t;
if(maxKnown[cap] != unknown) return maxKnown[cap];
for(i = 0, max = 0; i < N; i++)
...{
if((space = cap - items[i].size) >= 0)
...{
if((t = knap(space) + items[i].val) > max)
...{
max = t;
maxi = i;
}
}
}
maxKnown[cap] = max;
return max;
}
本文对比了递归与动态规划解决斐波纳契数列及背包问题的不同实现方式。通过具体代码示例展示了两种方法的特点及其适用场景。

被折叠的 条评论
为什么被折叠?



