Topcoder_2_162

【问题描述】
    一个由非负整数数组组成的包,该包中装的是一些相同的商品,整数代表它们的数量(可能重复),它们之间顺序可以是任意的。有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
  1. import java.util.HashMap;
  2. import java.util.Map;
  3. public class PrimeSums {
  4.     private Map<String,Integer> sumMap = new HashMap<String, Integer>();
  5.     private boolean isPrimeNumber(int num) {
  6.         double sqrt = Math.sqrt(num);
  7.         if(num==0 || num==1)
  8.             return false;
  9.         for (int i = 2; i <= sqrt; i++) {
  10.             if (num % i == 0)
  11.                 return false;
  12.         }
  13.         return true;
  14.     }
  15.     private void getSubCnt(String str, int start, int[] bag) {
  16.         if(start==bag.length){
  17.             StringBuilder sb = new StringBuilder();
  18.             String[] tmp = str.trim().split("//s");
  19.             int sum=0;
  20.             for (String string : tmp) {
  21.                 sb.append(string).append(" ");
  22.                 if(!"".equals(string))
  23.                     sum += Integer.parseInt(string);
  24.             }
  25.             sumMap.put(sb.toString().trim(),sum);
  26.             return;
  27.         }
  28.         getSubCnt(str, start+1, bag);
  29.         getSubCnt(str+bag[start]+" ", start+1, bag);
  30.     }
  31.     public long getCount(int[] bag) {
  32.         int count = 0;
  33.         getSubCnt(""0, bag);
  34.         for (String str : sumMap.keySet()) {
  35.             if (isPrimeNumber(sumMap.get(str).intValue()))
  36.                 count++;
  37.         }
  38.         return count;
  39.     }
  40. }
【算法思想】
    使用递归方式得到集合中所有组合的情况,再排除重复后进行计数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值