首页 > 技术文章 > 多个长度集合拼接出想要长度的组合

mxh-java 2021-07-13 23:13 原文

多个长度集合拼接出想要长度的组合
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @program: world
 * @description: 多个长度集合拼接出想要长度的组合
 * @author: XinHai.Ma
 * @create: 2021-07-11 21:41
 */
@SuppressWarnings("all")
public class CountTests {

    private static final Logger logger = LoggerFactory.getLogger(CountTests.class);

    public static void main(String[] args) {
        // 8种长度模具
        int[] nums = new int[8];
        nums[0] = 10;
        nums[1] = 11;
        nums[2] = 12;
        nums[3] = 13;
        nums[4] = 14;
        nums[5] = 15;
        nums[6] = 7;
        nums[7] = 8;

        // 顺序模具
        int[] nums1 = new int[8];
        nums1[0] = 7;
        nums1[1] = 8;
        nums1[2] = 10;
        nums1[3] = 11;
        nums1[4] = 12;
        nums1[5] = 13;
        nums1[6] = 14;
        nums1[7] = 15;

        int totalLen1 = 36; // 40
        int totalLen2 = 36; // 42

            for (int j = 0; j < nums.length; j++) {
                if(j <= nums.length-4) {
                    int total = nums[j] + nums[j+1] + nums[j+2] + nums[j+3];
                    if(total <= totalLen2) {
                        logger.info("{}={}+{}+{}+{}", total, nums[j], nums[j+1], nums[j+2], nums[j+3]);
                    }
                }

                for(int i=j+2; i < nums.length; i++) {
                    if(i <= nums.length-3) {
                        int total = nums[j] + nums[i] + nums[i+1] + nums[i+2];
                        if(total <= totalLen2) {
                            logger.info("{}={}+{}+{}+{}", total, nums[j], nums[i], nums[i+1], nums[i+2]);
                        }
                    }
                }
            }


            for (int j = 0; j < nums.length; j++) {
                if(j <= nums.length-3) {
                    int total = nums[j] + nums[j+1] + nums[j+2];
                    if(total <= totalLen2) {
                        logger.info("{}={}+{}+{}", total, nums[j], nums[j+1], nums[j+2]);
                    }

                    int num = totalLen1 - total;
                    int num1 = totalLen2 - total;
                    for (int i1 = nums1.length-1; i1 >= 0; i1--) {
                        if(num >= nums1[i1] && ((nums1[i1]+total) <= totalLen1)) {
                            logger.info("{}={}+{}+{}+{}", total, nums[j], nums[j+1], nums[j+2], nums1[i1]);
                        }
                        if(num1 >= nums1[i1] && ((nums1[i1]+total) <= totalLen2)) {
                            logger.info("{}={}+{}+{}+{}", total, nums[j], nums[j+1], nums[j+2], nums1[i1]);
                        }
                    }
                }
                for(int i=j+2; i < nums.length; i++) {
                    if(i <= nums.length-2) {
                        int total = nums[j] + nums[i] + nums[i+1];
                        if(total <= totalLen1) {
                            logger.info("{}={}+{}+{}", total, nums[j], nums[i], nums[i+1]);
                        }

                        int num = totalLen1 - total;
                        int num1 = totalLen2 - total;
                        for (int i1 = nums1.length-1; i1 >= 0; i1--) {
                            if(num >= nums1[i1] && ((nums1[i1]+total) <= totalLen1)) {
                                logger.info("{}={}+{}+{}+{}", total, nums[j], nums[i], nums[i+1], nums1[i1]);
                            }
                            if(num1 >= nums1[i1] && ((nums1[i1]+total) <= totalLen2)) {
                                logger.info("{}={}+{}+{}+{}", total, nums[j], nums[i], nums[i+1], nums1[i1]);
                            }
                        }
                    }
                }
            }
    }

}

计算结果
23:10:26.420 [main] INFO com.maxinhai.world.CountTests - 33=10+11+12
23:10:26.423 [main] INFO com.maxinhai.world.CountTests - 35=10+12+13
23:10:26.423 [main] INFO com.maxinhai.world.CountTests - 32=10+15+7
23:10:26.423 [main] INFO com.maxinhai.world.CountTests - 25=10+7+8
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 25=10+7+8+11
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 25=10+7+8+11
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 25=10+7+8+10
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 25=10+7+8+10
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 25=10+7+8+8
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 25=10+7+8+8
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 25=10+7+8+7
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 25=10+7+8+7
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 36=11+12+13
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 33=11+15+7
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 26=11+7+8
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 26=11+7+8+10
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 26=11+7+8+10
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 26=11+7+8+8
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 26=11+7+8+8
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 26=11+7+8+7
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 26=11+7+8+7
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 34=12+15+7
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 27=12+7+8
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 27=12+7+8+8
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 27=12+7+8+8
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 27=12+7+8+7
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 27=12+7+8+7
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 35=13+15+7
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 28=13+7+8
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 28=13+7+8+8
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 28=13+7+8+8
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 28=13+7+8+7
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 28=13+7+8+7
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 36=14+15+7
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 29=14+7+8
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 29=14+7+8+7
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 29=14+7+8+7
23:10:26.424 [main] INFO com.maxinhai.world.CountTests - 30=15+7+8

上面代码计算出来的结果是不全面的,代码逻辑有问题,刚开始我把这个东西想的复杂,看下面;

下面代码计算的会很全面,但是也有一半的重复结果,所以需要过滤掉重复结果;

多个for循环,表示你想要几节的组合方式;

import java.util.ArrayList;
import java.util.List;

/**
 * @program: world
 * @description: 桩节组合计算
 * @author: XinHai.Ma
 * @create: 2021-09-30 17:29
 */
public class PileBuildCompute {

    public static void main(String[] args) {

        // 模具
        int moulds[] = {7,8,9,10,11,12,13,14,15};

        // 桩长
        int pileLen = 45;

        // 计算结果
        List<String> pileBuildList = new ArrayList<>();

        for (int i = 0; i < moulds.length; i++) {
            int num1 = moulds[i];
            // 一根模具就能匹配出桩长
            int total0 = num1;
            if(total0 == pileLen) {
                pileBuildList.add(total0 + "=" + num1);
            }
            for (int i1 = 0; i1 < moulds.length; i1++) {
                int num2 = moulds[i1];
                // 两根模具就能匹配出桩长
                int total1 = num1 + num2;
                if(total1 == pileLen) {
                    pileBuildList.add(total1 + "=" + num1 + "+" + num2);
                }
                for (int i2 = 0; i2 < moulds.length; i2++) {
                    int num3 = moulds[i2];
                    // 三根模具就能匹配出桩长
                    int total2 = num1 + num2 + num3;
                    if(total2 == pileLen) {
                        pileBuildList.add(total2 + "=" + num1 + "+" + num2  + "+" + num3);
                    }
                    for (int i3 = 0; i3 < moulds.length; i3++) {
                        int num4 = moulds[i3];
                        // 四根模具就能匹配出桩长
                        int total3 = num1 + num2 + num3 + num4;
                        if(total3 == pileLen) {
                            pileBuildList.add(total3 + "=" + num1 + "+" + num2 + "+" + num3 + "+" + num4);
                        }
                        for (int i4 = 0; i4 < moulds.length; i4++) {
                            int num5 = moulds[i4];
                            // 五根模具就能匹配出桩长
                            int total = num1 + num2 + num3 + num4 + num5;
                            if(total == pileLen) {
                                pileBuildList.add(total + "=" + num1 + "+" + num2 + "+" + num3 + "+" + num4 + "+" + num5);
                            }
                        }
                    }
                }
            }
        }

        // 打印计算结果
        pileBuildList.forEach(pileBuild -> {
            System.out.println(pileBuild);
        });

    }

}

  

 

推荐阅读