代码
import com.ibm.icu.math.BigDecimal; public class test { public static void main(String[] args) { //数组,将int、double类型的数字转为BigDecimal便于计算 BigDecimal[] l=new BigDecimal[100]; for(int i=1;i<=100;i++) { l[i-1]=new BigDecimal(i); } //400为传入值 Integer[] subSet = Combination(l,new BigDecimal(400)); //返回索引 System.err.print("返回索引:"); for (Integer integer : subSet) { System.err.print(integer+" "); } //返回索引对应数字 System.err.println(); System.err.print("对应数字:"); for (Integer integer : subSet) { System.err.print(l[integer]+" "); } } static Integer[] reslist = null; static boolean flagTe=true; public static Integer[] Combination(BigDecimal[] l, BigDecimal sum) { flagTe=true; reslist = null; BigDecimal[] l1=new BigDecimal[l.length]; for (int i = 0; i < l.length; i++) { l1[i]=l[i]; } int len = l1.length; int j = 0; //冒泡排序 从小到大排序 while (j <= len - 1) { // 循环两两对比 for (int i = 1; i < len - j; i++) { BigDecimal tmp =new BigDecimal(0); if (l1[i - 1].compareTo(l1[i]) == 1) { tmp = l1[i]; l1[i] = l1[i - 1]; l1[i - 1] = tmp; } } j++; } int start = 1; int end = 1; //确定最少几个数相加等于给定数字 BigDecimal tmp1 =new BigDecimal(0); for (int i = len - 1; i >=0 ; i--) { tmp1=tmp1.add(l1[i]); if(tmp1.compareTo(sum) > -1) { break; }else { start++; } } //确定最少几个数相加等于给定数字 BigDecimal tmp2 =new BigDecimal(0); for (int i =0 ; i-1) { break; }else { end++; } } for (int i = start; i <= end; i++) { if(!flagTe) { break; } Integer[] inv = new Integer[i]; Combination(l, 0, inv, 0, sum); } return reslist; } static BigDecimal number = null; static int ap1 =0; public static void Combination(BigDecimal[] l, int a_pos, Integer[] inv, int rs_pos,BigDecimal sum) { ap1 =l.length; if (rs_pos >= inv.length) { Integer[] inv2 = inv.clone(); if(ap1>0) { number=new BigDecimal(0); boolean flag1=true; for (int i = 0; i < inv2.length; i++) { if(inv2[i]==null) { flag1=false; break; } number=number.add(l[inv2[i]]); } if(flag1 && number.subtract(sum).compareTo(BigDecimal.ZERO)==0) { reslist=new Integer[inv2.length]; for (int i = 0; i < inv2.length; i++) reslist[i]=inv2[i]; flagTe=false; ap1=0; } } } else if(ap1>0) { for (int ap = a_pos; ap 结果
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)