背景: 因为个人喜欢玩三国杀,又非常喜欢张昌蒲这个武将,所以闲暇之余写了一个张妈严教技能计算的代码,请各位朋友指正
技能: 张妈的严教技能简单来说就是,可以亮出4-10张1-13点数的牌,把这些牌分成点数之和相等的两组,你与张昌蒲各获得其中一组
思路: 从张妈技能可以看出拿牌涉及点数之和计算,且拿牌的数量不定,所以可以延伸出很多拿牌组合,这里把所有组合都展示出来(注意:你和张昌蒲把牌反过来拿的不展示,正反拿牌只展示一种组合)
这里给出两种设计思路:
一)一次处理,把所有严教牌的所有点数之和的可能,全部列出来,从中找出点数相同的牌
二)分类处理,严教的拿牌可能无非有三种情况,1对1拿牌,多对1拿牌(1对多同理),多对多拿牌,所以能拿的分三种单独处理,从中找出点数相同的牌
两种代码我都实现了,严教拿牌组合也相同,这里只展示思路一的代码
代码展示:

Scanner scanner = new Scanner(System.in);
        System.out.print("请输入严教牌的数量(4-10):");
        int num = scanner.nextInt();
        if(num > 10 || num < 4){
            System.out.println("输入严教牌的数量有误,应输入4-10之间!");
            return;
        }
        System.out.println("请输入" + num + "个严教牌点数(点数1-13):");
        List<Integer> list = new ArrayList<Integer>();
        for(int i = 0 ; i < num ; i++){
            System.out.print("第" + (i+1) + "个严教牌:");
            int key = scanner.nextInt();
            if(key > 13 || key < 1){
                System.out.println("输入严教牌的点数有误,应输入1-13之间!");
                return;
            }
            list.add(key);
        }
        Collections.sort(list);
        System.out.println("严教牌排序(从小到大):" + list.toString());
        Map<String,Integer> map = new HashMap<String,Integer>();
        // 排列出所有点数之和的可能
        for(int i = 0 ; i < list.size() ; i++) {
            int ivalue = list.get(i);
            String ikey = ivalue + "[" + i + "]";
            if(!map.containsKey(ikey)){
                map.put(ikey,ivalue);
            }
            for (int m = i + 1; m < list.size(); m++) {
                int imvalue = list.get(i);
                int mvalue = list.get(m);
                imvalue += mvalue;
                String mkey = ikey + "," + mvalue + "[" + m + "]";
                if(!map.containsKey(mkey)){
                    map.put(mkey,imvalue);
                }
                for (int j = m + 1; j < list.size(); j++) {
                    int jmvalue = imvalue;
                    int jvalue = list.get(j);
                    jmvalue += jvalue;
                    String jkey = mkey + "," + jvalue + "[" + j + "]";
                    if(!map.containsKey(jkey)){
                        map.put(jkey,jmvalue);
                    }
                }
            }

        }
        int total = 0;
        Map<String,String> map2 = new HashMap<String,String>();
        for(Map.Entry<String, Integer> entry : map.entrySet()){
            String key = entry.getKey();
            int value = entry.getValue();
            List<String> keyList = Arrays.asList(key.split(","));
            for(Map.Entry<String, Integer> entry2 : map.entrySet()){
                String key2 = entry2.getKey();
                int value2 = entry2.getValue();
                boolean flag = true;
                // 排除点数之和相同的两组存在同一元素
                for(String str : keyList){
                    if(key2.contains(str)){
                        flag = false;
                        break;
                    }
                }
                if(flag){
                    // 排除重复数据
                    if((!key.equals(key2)) && value == value2){
                        // 排除正反拿牌
                        if(!((map2.containsKey(key) && key2.equals(map2.get(key))) || (map2.containsKey(key2) && key.equals(map2.get(key2))))){
                            total++;
                            System.out.println("严教组合" + total + ":");
                            System.out.println("严教牌(你):" + key);
                            System.out.println("严教牌(张昌蒲):" + key2);
                            System.out.println("");
                            map2.put(key, key2);
                        }
                    }
                }
            }
        }

结果展示:
中括号内是严教牌排序后的下标(从0开始),因为可能存在相同点数但属于不同的牌,所以同点数也要考虑成不同组合
测试结果展示一:

请输入严教牌的数量(4-10):5
请输入5个严教牌点数(点数1-13):
第1个严教牌:10
第2个严教牌:5
第3个严教牌:8
第4个严教牌:3
第5个严教牌:2
严教牌排序(从小到大):[2, 3, 5, 8, 10]
严教组合1:
严教牌(你):10[4]
严教牌(张昌蒲):2[0],8[3]

严教组合2:
严教牌(你):10[4]
严教牌(张昌蒲):2[0],3[1],5[2]

严教组合3:
严教牌(你):2[0],8[3]
严教牌(张昌蒲):10[4]

严教组合4:
严教牌(你):2[0],3[1]
严教牌(张昌蒲):5[2]

严教组合5:
严教牌(你):5[2],8[3]
严教牌(张昌蒲):3[1],10[4]

严教组合6:
严教牌(你):8[3]
严教牌(张昌蒲):3[1],5[2]

测试结果展示二:

请输入严教牌的数量(4-10):7
请输入7个严教牌点数(点数1-13):
第1个严教牌:7
第2个严教牌:2
第3个严教牌:13
第4个严教牌:7
第5个严教牌:6
第6个严教牌:1
第7个严教牌:10
严教牌排序(从小到大):[1, 2, 6, 7, 7, 10, 13]
严教组合1:
严教牌(你):6[2],7[3]
严教牌(张昌蒲):1[0],2[1],10[5]

严教组合2:
严教牌(你):6[2],7[3]
严教牌(张昌蒲):13[6]

严教组合3:
严教牌(你):6[2],10[5]
严教牌(张昌蒲):1[0],2[1],13[6]

严教组合4:
严教牌(你):6[2],10[5]
严教牌(张昌蒲):2[1],7[3],7[4]

严教组合5:
严教牌(你):7[3]
严教牌(张昌蒲):1[0],6[2]

严教组合6:
严教牌(你):7[3]
严教牌(张昌蒲):7[4]

严教组合7:
严教牌(你):1[0],6[2]
严教牌(张昌蒲):7[3]

严教组合8:
严教牌(你):1[0],6[2]
严教牌(张昌蒲):7[4]

严教组合9:
严教牌(你):1[0],7[3]
严教牌(张昌蒲):2[1],6[2]

严教组合10:
严教牌(你):10[5]
严教牌(张昌蒲):1[0],2[1],7[4]

严教组合11:
严教牌(你):10[5]
严教牌(张昌蒲):1[0],2[1],7[3]

严教组合12:
严教牌(你):1[0],2[1],7[4]
严教牌(张昌蒲):10[5]

严教组合13:
严教牌(你):1[0],13[6]
严教牌(张昌蒲):7[3],7[4]

严教组合14:
严教牌(你):1[0],2[1],10[5]
严教牌(张昌蒲):6[2],7[3]

严教组合15:
严教牌(你):1[0],2[1],10[5]
严教牌(张昌蒲):6[2],7[4]

严教组合16:
严教牌(你):1[0],2[1],10[5]
严教牌(张昌蒲):13[6]

严教组合17:
严教牌(你):1[0],7[3],7[4]
严教牌(张昌蒲):2[1],13[6]

严教组合18:
严教牌(你):1[0],7[4]
严教牌(张昌蒲):2[1],6[2]

严教组合19:
严教牌(你):2[1],7[3],10[5]
严教牌(张昌蒲):6[2],13[6]

严教组合20:
严教牌(你):2[1],7[4],10[5]
严教牌(张昌蒲):6[2],13[6]

严教组合21:
严教牌(你):6[2],7[4]
严教牌(张昌蒲):1[0],2[1],10[5]

严教组合22:
严教牌(你):6[2],7[4]
严教牌(张昌蒲):13[6]

严教组合23:
严教牌(你):1[0],2[1],13[6]
严教牌(张昌蒲):6[2],10[5]

以上并未进行详细测试,请各位网友指正~~