(day 8)持续学习:暴力递归-尝试模型

189 阅读1分钟

从左往右尝试

数字转换成字符

1->a;2->b;3->c ……,给定一个数字字符串,计算所有可能.

如:给定的数值字符串为111,所有可能的结果是:

A|A|A

A|K

K|A

思路:

从左往右进行划分,有点类似按需进行排列。不断将字符串进行拆分尝试,在当前层拆分完之后,保留当前状态,进行下一层次的拆分。

	/**
	 * 数字转换成字符
	 * 1-a 2->b 3->c
	 * 给定一个数字字符串,计算所有可能
	 */
	public static void convert(String numStr, String curBranchResults, List<String> allRes){

		if(numStr.length() == 0){
			allRes.add(curBranchResults.substring(1));
			return;
		}

		for(int i=0;i< numStr.length();i++){

			String sub = numStr.substring(0, i+1);
			int wordNum = Integer.valueOf(sub);

			String nexSubStr = "";
			if(i+1 < numStr.length()){
				nexSubStr = numStr.substring(i+1);
			}

			if(wordNum <= 26){
				convert(nexSubStr, curBranchResults + "|" + convert(wordNum), allRes);
			}else{
				break;
			}
		}
	}

	public static String convert(int wordNum){

		if(wordNum== 0){
			return "";
		}
		return Character.valueOf((char) ('A' -1 + wordNum)).toString();

	}

产品选择问题

给你一系类产品,你一个可以承受n重量的背包,让你从系列产品中选出重量最大的值。

思路:有点类似属性递归的套路题,考虑X步,选和不选的情况进行比较,往上层返回更大的值。


	static class Produce{
		int weight;
		int value;
		public Produce(int w, int v){
			this.weight = w;
			this.value = v;
		}
	}

	public static int process(Produce[] produces, int i, int bag){

		if(bag < 0){
			return -1;
		}

		if(i >= produces.length){
			return 0;
		}

		int v = produces[i].value;
		int w = produces[i].weight;
		//不选
		int p1 = process(produces, i+1, bag);

		//选
		int p2 = process(produces, i+1, bag - w);

		if(p2 == -1){
			return p1;
		}

		return Math.max(p1, p2 + v);

	}

范围尝试模型