暴力递归2

1.

* 将一个字符串转换为字母的形式,转换规则如下:
* 对一个字符串:123,可以将其看成三个部分转为1--A,2--B,3--C,也可转为12--L,3--C
* 即既可以转为ABC,也可以转为LC
*
* 现求该字符串有多少种转换形式

代码及解析:

 1 //该函数表示str在0——i - 1位置都确定时,可以进行的向下递归情况
 2     public static int process(char[] str,int i) {
 3         if (i == str.length) {//转移到最后一个说明形成了一种可行的转换情况
 4             return 1;
 5         }
 6         if (str[i] == '0') {//单独的一个0开头无法转换,说明之前的转法有错误,所以该路径可能的情况为0种
 7             return 0;
 8         }
 9         if (str[i] == '1') {
10             int ans = process(str,i + 1);//直接将str[i]转为A,再向后续进行转换
11             if (i + 1 < str.length) {
12                 ans += process(str, i + 2);//将str[i]和str[i+1]作为整体转为一个字符,再向后续进行转换
13             }
14             return ans;
15         }
16         if (str[i] == '2') {//思路与str[i] == '1'类似
17             int ans = process(str,i + 1);
18             if (i + 1 < str.length && str[i + 1] >= '0' && str[i + 1] <= '6') {
19                 ans += process(str,i + 2);
20             }
21             return ans;
22         }
23         //str[i] == '3' —— '9'的情况(只能把一个作为整体来转)
24         return process(str,i + 1);
25     }

 

2.

* 背包问题的暴力递归解法
*
* 即通过递归去尝试是否取每一种物品,去遍历所有情况后找到最优解法

代码及解析:

 1 //[]weights,[]values为每件商品的重量和价值,i表示目前选到第i个背包,alreadyweight为目前已承载的重量
 2     //bag为最大可承受的重量
 3     public static int process(int[] weights,int [] values,int i,int alreadyweight,int bag) {
 4         if (alreadyweight > bag) {
 5             return 0;
 6         }
 7         if (i == weights.length) {//没有东西可取了
 8             return 0;
 9         }
10         //分取和不取两种情况讨论
11         return Math.max(process(weights,values,i + 1,alreadyweight,bag), 
12                 values[i] + process(weights,values,i + 1,alreadyweight + weights[i],bag));
13     }

 

posted @ 2022-04-28 15:53  jue1e0  阅读(18)  评论(0)    收藏  举报