您的位置:首页 > 其它

《C算法》——递归和动态规划

2006-09-28 16:28 232 查看
递归

动态规划可以非常容易的将一个指数时间的递归问题转化为线性时间。下面是两个简单的例子。

----------------------------------------------------------------------------------------------------
斐波纳契数(递归实现)不可行


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
;




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;


}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: