多个长度集合拼接出想要长度的组合
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); }); } }