从订阅博客中看到这道题,于是花了上午的时间写了一下,此题类似于0-1背包问题,故复习了一下,分别有递归和非递归的解法。
题目:给定一个数t,以及n个整数,在这n个整数中找到相加之和为t的所有组合,例如t = 4,n = 6,这6个数为[4, 3, 2, 2, 1, 1],这样输出就有4个不同的组合,它们的相加之和为4:4, 3+1, 2+2, and 2+1+1。请设计一个高效算法实现这个需求。
递归解法:
private static int[] a={4,3,2,2,2,1,1}; private static int t=8; private static int n=7; private static boolean[] flags;
public static int subNum(int s,int r){ if(s==0){ output(0); // System.out.println(r); return 1; }else{ if(s<0 || (s>0 && r>=n)){ return 0; }else{ flags[r]=true; int f=subNum(s-a[r],r+1); // while (r+1<n && a[r+1] == a[r]) // r++; flags[r]=false; f=subNum(s,r+1); return 0; /* * if(subNum(s-a[r],r+1)==1){ //System.out.println(s+" "+r); * return 1; }else{ flags[r]=false; return subNum(s,r+1); } */ } } } |
非递归算法:
private final static int N = 20; private static int W[] = { 1, 1, 1, 2, 2, 3, 4, 4, 5, 5, 5, 8, 8, 8, 10, // private static int W[]={4,3,2,2,2,1,1}; // 若原W无序,则先对其排序 private static int stack[] = new int[20]; private static int stackIdx; private static void output() { private static void outstack() { public static void subNum() { } |