递归到循环的编程转换:CSDN采药问题解答

需积分: 27 14 下载量 124 浏览量 更新于2024-09-13 收藏 13KB TXT 举报
该资源是CSDN编程大赛中关于采药问题的个人解答代码,涉及到了递归算法与循环结构的转化。在解决“XX采药”问题时,题目要求利用动态规划的方法,解决背包问题,其中涉及到一个整数数组`t`表示每种药材的价值,另一个数组`v`表示每种药材的重量,目标是在不超过总重量`T`的情况下,获取总价值最大化。函数`V(int[] t, int[] v, int T, int M)`采用递归的方式实现,它接收四个参数:药材价值数组`t`、药材重量数组`v`、最大允许总重量`T`和剩余可选药材数量`M`。 递归函数的工作原理是: 1. 基本情况:当`M`或`T`为0时(即没有剩余药材或达到最大重量),返回0,因为无法再采药或超过允许的重量。 2. 当剩余药材`M`不为空且当前药材重量`t[M-1]`小于等于剩余的总重量`T`,则有两种选择:一是选取当前药材(`v[M-1]`),此时剩余重量为`T - t[M-1]`,剩余可选药材数为`M-1`;二是不选取当前药材,剩余重量和可选药材数不变。函数分别计算这两种情况下的总价值,然后选择较大者作为结果。 3. 如果选择当前药材,那么`v1`就是取值的结果;如果不取,`v2`就是结果。最后,根据`v1`和`v2`的大小返回较大的那个,即最优解。 为了优化性能,作者还提供了一个名为`V2`的改进版本,它使用了二维数组`int[,] V`来存储中间状态,避免重复计算,这是从递归转化为循环的关键。这个转换采用了动态规划的思想,通过填充`V`数组,将所有可能的组合情况逐步计算并存储,从而实现对整个问题空间的高效搜索。这种算法的时间复杂度相较于递归方法有显著提升,减少了函数调用的开销,使得程序运行时间更短,达到了3.765秒。 这个解答适用于解决背包问题中的贪心策略,并展示了如何将递归算法转换为更为高效的循环实现,对于学习动态规划和背包问题的解决策略具有参考价值。