1. 程式人生 > >為陣列分組,使兩組中各元素加起來的和相等

為陣列分組,使兩組中各元素加起來的和相等

//描述
//編寫一個函式,傳入一個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