给出一组数,若能分成两组和相等的数,则说这组数能构成均衡等式,比如1.2.3.4,10可以构成形如1+2+3+4=10的均衡等式,但1,2,3,4,5就不能构成均衡等式。
package com.algorithm.odd;
import java.util.Collections;
import java.util.LinkedList;
public class BalancEquation {
public static boolean judge(int[] array){
int length=array.length;
int step=1;
int[] result=new int[length];
int sum=0;
int num=0;
LinkedList<Integer> list=new LinkedList<>(Collections.nCopies(length, 0));/*初始化*/
LinkedList<Integer> list1=new LinkedList<>();
int listEnd=length;
int count=0;
for(int e:array){
sum=sum+e;
}
for(step=0;step<length;step++){
/*count=0;*/
for(int i=0;i<list.size()/*listEnd*/;i++){
for(int j=step+i;j<length;j++){
num=array[j]+list.get(i); /*长度为n的组合实在长度为n-1的组合的基础上产生的*/
System.out.println("num="+num);
if(2*num==sum){
return true;
}
list1.add(num);
/*count++;*/
}
if(step==0) break;
}
/*listEnd=count;*/
list.clear();
list.addAll(list1);
list1.clear();
}
return false;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array=new int[]{1,2,3,4,10,11,9};
System.out.println("能构成均衡等式:"+judge(array));
}
}
输出结果:
num=1
num=3
num=4
num=5
num=11
num=12
num=10
num=3
num=6
num=7
num=13
num=14
num=12
num=6
num=10
num=16
num=17
num=15
num=10
num=20
能构成均衡等式:true
需要说明的是代码注释处,这里有这样一种规律,长度为n的组合是在长度为n-1的组合的基础上产生的。如1,2,3,4,10,11,9,所有长度为1的组合为(1),(2),(3),(4),(10),(11),(9)共7种,把它们存在list中;长度为2的组合这样产生,从list中取出长度为1的第1种组合,即1,然后得到(1,2),(1,3),(1,4),(1,10),(1,11),(1,9),再从list中取长度为1的第2中组合,得(2,3,),(2,4),(2,10),(2,11),(2,9),之后以此类推,所有长度为n的组合都和长度为n-1的组合存在这种关系。具体细节见代码。