题目:
程序:
package com.ynu.point;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Scanner;
/**
* 5
* 1 1 22 23 2 -- 1<=n<=23
* 3 -- 子集相互不同
*/
public class point24 {
public static void main(String[] args) {
//输入
Scanner sc = new Scanner(System.in);
ArrayList<Integer> numbers = new ArrayList<>(23);
int n = sc.nextInt();
for(int i = 0;i<n;i++){
int t = sc.nextInt();
numbers.add(t);
}
//排序--升序
Collections.sort(numbers);
//枚举子集,计算24点
HashSet<ArrayList<Integer>> pointSet = new HashSet<>();
for(int i=1;i<=Math.pow(2,n)-1;i++){
ArrayList<Integer> temp = getSubList(numbers,i,n);
if(calculation(temp)==24){
pointSet.add(temp);
}
}
System.out.println(pointSet.size());
}
private static int calculation(ArrayList<Integer> para){
if(para == null || para.isEmpty()){
return 0;
}else {
int result = 0;
for(Integer i : para){
result += i;
}
return result;
}
}
private static ArrayList<Integer> getSubList(ArrayList<Integer> num,Integer pos,Integer length){
//去掉只有一位数的集合
if((pos&(pos-1)) == 0){
return null;
}
ArrayList<Integer> result = new ArrayList<>(length);
String index = Integer.toBinaryString(pos);
int il = index.length();
//二进制位数不足时,向左补全
if(il<length){
for(int i = 0;i<length-il;i++){
index = "0"+index;
}
}
for(int i=0;i<index.length();i++){
if('1' == index.charAt(i)){
result.add(num.get(i));
}
}
return result;
}
}
说明:
第一版代码,暂时未做优化,优化后将即使更新