Java 集合、数组 最少个数数字相加等于一个指定的数
最近写代码的时候遇到一个需求,用数组、集合中最少的数字相加等于指定的一个数字,写完之后特写此篇文章以做记录。
代码:此处指定数字为400
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 <len; i++) {
tmp2=tmp2.add(l1[i]);
if(tmp2.compareTo(sum) > -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 <ap1; ap++) {
inv[rs_pos] = ap;
Combination(l, ap + 1, inv, rs_pos + 1,sum);
}
}
}
}
结果:返回对应数字的索引和对应的数字