【问题描述】
一个由非负整数数组组成的包,该包中装的是一些相同的商品,整数代表它们的数量(可能重复),它们之间顺序可以是任意的。有2个包A和B,如果A中包含的数量是由B中包含的数量组成的,那么A为B的子包。包中所有元素的和为包的总重量。
例如:包(1,2,1,3,1) 和 (3,1,1,1,2)是相同的(以为和顺序无关),但是和 包(1,2,3,3)是不同的。包 (1,2) 和 (3,1,1)是包(1,2,1,3,1)的子包,为(1,2,2)不是。包(1,2,1,3,1)的重量是1+2+1+3+1=8。
现在要求实现一个方法,计算所有子包中重量值是素数的子包个数。(注:0和1不是素数)
定义:
类 PrimeSums
方法 public long getCount(int[] bag);
约束:
1、包包含1至50个元素(包含)
2、每个元素的数量包含0至10000(包含)
测试用例:
1、{1,1,2,7}
Returns: 5
2、{1,1,1,1,1,1,1,1,1,1}
Returns: 4
3、{4,6,8,10,12,14}
Returns: 0
4、{1,2,4,8,16,32,64,128}
Returns: 54
5、{0,0,7}
Returns: 3
【算法思想】
使用递归方式得到集合中所有组合的情况,再排除重复后进行计数。
一个由非负整数数组组成的包,该包中装的是一些相同的商品,整数代表它们的数量(可能重复),它们之间顺序可以是任意的。有2个包A和B,如果A中包含的数量是由B中包含的数量组成的,那么A为B的子包。包中所有元素的和为包的总重量。
例如:包(1,2,1,3,1) 和 (3,1,1,1,2)是相同的(以为和顺序无关),但是和 包(1,2,3,3)是不同的。包 (1,2) 和 (3,1,1)是包(1,2,1,3,1)的子包,为(1,2,2)不是。包(1,2,1,3,1)的重量是1+2+1+3+1=8。
现在要求实现一个方法,计算所有子包中重量值是素数的子包个数。(注:0和1不是素数)
定义:
类 PrimeSums
方法 public long getCount(int[] bag);
约束:
1、包包含1至50个元素(包含)
2、每个元素的数量包含0至10000(包含)
测试用例:
1、{1,1,2,7}
Returns: 5
2、{1,1,1,1,1,1,1,1,1,1}
Returns: 4
3、{4,6,8,10,12,14}
Returns: 0
4、{1,2,4,8,16,32,64,128}
Returns: 54
5、{0,0,7}
Returns: 3
- import java.util.HashMap;
- import java.util.Map;
- public class PrimeSums {
- private Map<String,Integer> sumMap = new HashMap<String, Integer>();
- private boolean isPrimeNumber(int num) {
- double sqrt = Math.sqrt(num);
- if(num==0 || num==1)
- return false;
- for (int i = 2; i <= sqrt; i++) {
- if (num % i == 0)
- return false;
- }
- return true;
- }
- private void getSubCnt(String str, int start, int[] bag) {
- if(start==bag.length){
- StringBuilder sb = new StringBuilder();
- String[] tmp = str.trim().split("//s");
- int sum=0;
- for (String string : tmp) {
- sb.append(string).append(" ");
- if(!"".equals(string))
- sum += Integer.parseInt(string);
- }
- sumMap.put(sb.toString().trim(),sum);
- return;
- }
- getSubCnt(str, start+1, bag);
- getSubCnt(str+bag[start]+" ", start+1, bag);
- }
- public long getCount(int[] bag) {
- int count = 0;
- getSubCnt("", 0, bag);
- for (String str : sumMap.keySet()) {
- if (isPrimeNumber(sumMap.get(str).intValue()))
- count++;
- }
- return count;
- }
- }
使用递归方式得到集合中所有组合的情况,再排除重复后进行计数。