1. 程式人生 > >小米oj——找出可能的合的組合——深搜

小米oj——找出可能的合的組合——深搜

描述
給出一組不重複的正整數,從這組數中找出所有可能的組合使其加合等於一個目標正整數 M,如:

一組數為 1, 2, 3,目標數為 4,那麼可能的加合組合為: 1, 1, 1, 1 1, 1, 2 1, 2, 1 1, 3 2, 1, 1 2, 2 3, 1 注意相同的組合數字順序不同也算一種,所以這個例子的結果是 7 種。

輸入
一組連續不重複的 N 個正整數(, 隔開,0<N<100)以及目標正整數(與陣列之間用空格隔開)

輸出
所有可能的加合等於目標正整數 M 的組合種數

輸入樣例
1,2,3 4
複製樣例
輸出樣例
7

本題採用深搜,通俗的將就是列舉所有情況,我們通過遞迴的方式來完成。
我們從右往左進行。每進行一步都有三種選擇
1.選擇當前的數
2.選擇當前的數向前一位
3.不選擇當前的數向前以為
通過這樣我們就可以遞迴出所有的情況,當然還需要貼上一些約束條件

package 小米oj;

public class 找出可能的合的組合 {
static int sum ;
	

	private static String solution(String line)
	{
		String a1[]= line.split(" ");
		String a2[] =a1[0].split(",");
		int goal2 = Integer.parseInt(a2[a2.length-1]);
		int goal1 = Integer.parseInt(a2[0]);
		int goal = Integer.parseInt(a1[1]);
		find(goal,goal1,goal2);
		return String.valueOf(sum);

		
		}
	public static void find(int goal,int goal1,int goal2)
	{
		if(goal2<goal1||goal<0)
			return;
		if(goal ==0)
		{
			sum++;
			return ;    
		}
	
		find(goal-goal2,goal1,goal2);
		find(goal,goal1,goal2-1);
		find(goal-goal2,goal1,goal2-1);
		
		
	}
	public static void main(String[] args) {
		sum =0;
		System.out.println(solution("1,2,3 4"));
	}
	

}