為陣列分組,使兩組中各元素加起來的和相等
阿新 • • 發佈:2019-02-04
//描述
//編寫一個函式,傳入一個int型陣列,返回該陣列能否分成兩組,
//使得兩組中各元素加起來的和相等,
//並且,所有5的倍數必須在其中一個組中,所有3的倍數在另一個組中(不包括5的倍數),
//能滿足以上條件,返回true;不滿足時返回false。
//知識點 字串,迴圈,函式,指標,列舉,位運算,結構體,聯合體,檔案操作,遞迴
//執行時間限制 10M
//記憶體限制 128
//輸入
//輸入輸入的資料個數
//輸入一個int型陣列
//
//輸出
//返回true或者false
//
//樣例輸入 4 1 5 -5 1
//樣例輸出 true
解析:本題需考慮完整,避免有些測試用例的漏寫。
1、可以被5整除的數的和,
2、可以被3整除的數的和,不包括同時可以被5整除的數,
3、將不能被3和5整除的數存放在連結串列中,求出和
4、算出Sum3和Sum5的差的絕對值Abs,將Abs加入連結串列中
5、然後將連結串列中的數分成兩組,每組數的和為總和的1/2,(利用數學知識,總共有2的n次方種組合方式)
程式碼如下:
package hw07_14;
import java.io.*;
import java.util.Scanner;
import java.util.*;
public class Prog39_2 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNextInt()) {
int count = in.nextInt();
List<Integer> listOthers=new ArrayList<Integer>();
int sum3=0,sum5=0,sumTemp=0;
for(int i=0;i<count;i++){
int b = in.nextInt();
if(b%5==0)
sum5+=b;
else if(b%3==0){
sum3+=b;
}else if(b!=0){
listOthers.add(b);
sumTemp+=b;
}
}
if (listOthers.size()==0)
{
if(sum3==sum5){
System.out.println("true");
}
else{
System.out.println("false");
}
}
else
{
int minus=sum3-sum5;
if(minus!=0){
listOthers.add(minus);
sumTemp+=minus;
}
if(sumTemp%2!=0){
System.out.println("false");
}
else if(foo(listOthers,listOthers.size(),sumTemp/2))
{
System.out.println("true");
} else{
System.out.println("false");
}
}
}
}
static boolean foo(List<Integer> source,int len,int defaultSum){
int a=(int)java.lang.Math.pow(2,source.size());
for(int i=0;i<a;i++){
String str=Integer.toBinaryString(i);
int sum=0;
for(int j=0;j<str.length();j++)
{
char c = str.charAt(j);
if(c=='1')
{
sum+=source.get(j);
}else
continue;
}
if(sum==defaultSum)return true;
}
return false;
}// end foo
}//end class