看到題目,很顯然是0,1背包問題,苦于平時練手不多,在正在開始寫的時候犯難了,調試不通過,導致在規定的時間沒提交,后悔不已。之后自己解決了代碼問題,做個記錄。
題目:給定數組{1,3,4,5,9,11,2},輸出和為n的組合個數
分析:常規題目一般我給定連續的數組,如{1,2,3,4,5...,k},輸出何為n的組合個數,而題目給定的數組非連續,因此在遞歸代碼中勢必需要有個中間flag用來記錄選取信息。
直接貼自己寫的java代碼(沒提交好遺憾)
import java.util.HashMap;import java.util.Scanner;public class Sum { static int length; static int[] value = {1,3,4,5,9,11,2}; static HashMap<Integer,Integer> flag = new HashMap<Integer,Integer>(); static int count = 0; static void findCombination(int sum,int index){ if (index<0||sum<0) { return; } if (value[index]==sum) { flag.put(value[index], 1); for(Integer key:flag.keySet()) if(flag.get(key)==1){ System.out.PRint(key+" "); } flag.put(value[index],0); count++; System.out.println(); } flag.put(value[index], 1); findCombination(sum-value[index],index-1); flag.put(value[index], 0); findCombination(sum,index-1); } public static void main(String[] args) { /*int n,m; Scanner s=new Scanner(System.in); n=s.nextInt();*/ int n=4; flag.put(1, 0); flag.put(3, 0); flag.put(4, 0); flag.put(5, 0); flag.put(9, 0); flag.put(11, 0); flag.put(2, 0); findCombination(n,6); System.out.println(count); }}
新聞熱點
疑難解答