小米oj——找出可能的合的組合——深搜
阿新 • • 發佈:2018-11-09
描述
給出一組不重複的正整數,從這組數中找出所有可能的組合使其加合等於一個目標正整數 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")); } }