news 2026/8/28 18:07:47

【DFS+剪枝】BISHI91 拼接木棍

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【DFS+剪枝】BISHI91 拼接木棍

思路

求解代码

// n: 小木棒总数, sum: 所有木棒总长度, targetL: 目标原始长度, numbers: 目标原始木棒根数privatestaticintn,sum,targetL,numbers;privatestaticInteger[]a;// 存储砍断后的小木棒长度publicstaticvoidmain(String[]args)throwsIOException{BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));PrintWriterout=newPrintWriter(newOutputStreamWriter(System.out));n=Integer.parseInt(br.readLine().trim());String[]s=br.readLine().trim().split("\\s+");a=newInteger[n];boolean[]used=newboolean[n];// 标记每根小木棒是否已被乔治使用sum=0;intmaxL=0;for(inti=0;i<n;i++){a[i]=Integer.parseInt(s[i]);sum+=a[i];maxL=Math.max(maxL,a[i]);// 原始长度至少要等于最长的那根小木棒}// 【剪枝优化 1】:降序排序。// 优先尝试长木棒。因为长木棒对位置要求更苛刻,如果它拼不通,能更早触发回溯。Arrays.sort(a,(x1,x2)->(x2-x1));// 枚举原始木棒可能的长度 targetL// 范围:从最长的那根开始,直到所有木棒的总和for(targetL=maxL;targetL<=sum;targetL++){// 【条件约束】:原始长度必须能被总长度整除,否则乔治不可能拼成同样长的木棒if(sum%targetL!=0){continue;}numbers=sum/targetL;// 计算在当前 targetL 下应该拼出多少根// 尝试拼凑,初始:已完成0根,当前长度0,从第0个小木棒开始找if(dfs(0,0,0,used)){out.println(targetL);// 找到第一个可行的最小长度,即为答案break;}}out.flush();out.close();br.close();}/** * DFS 拼凑过程 * * @param completed 已完整拼好的原始木棒根数 * @param currentL 当前正在拼的那根原始木棒已经达到的长度 * @param idx 为了避免重复组合,从数组的哪一个下标开始挑选下一根小木棒 * @param used 使用情况记录 */privatestaticbooleandfs(intcompleted,intcurrentL,intidx,boolean[]used){// 【递归出口】:如果乔治拼好了所有原始木棒,大功告成if(completed==numbers){returntrue;}// 如果当前这根拼满了,开启下一根木棒的拼凑if(currentL==targetL){returndfs(completed+1,0,0,used);}for(inti=idx;i<n;i++){// 如果这根用过了,或者放进去就超过了目标长度,跳过if(used[i]||currentL+a[i]>targetL){continue;}// 【做选择】:尝试放这根木棒used[i]=true;if(dfs(completed,currentL+a[i],i+1,used)){returntrue;}// 【撤销选择】:刚才的尝试失败了,拿出来used[i]=false;// --- 核心剪枝策略 (极其关键) ---// 【剪枝优化 2】:首棒失败判定// 如果此时 currentL 为 0,说明我们正在尝试拼一根新木棒的第一部分。// 如果第一部分用这根最长的木棒都拼不出来,那后面更拼不出来了。// 【剪枝优化 3】:末棒失败判定// 如果加上这根木棒刚好填满了 targetL,但在后续递归中失败了,// 说明用这根刚好填满的方案不行,那么换用几根更碎的小木棒来填这个坑也肯定不行。if(currentL==0||currentL+a[i]==targetL){returnfalse;}// 【剪枝优化 4】:去重剪枝// 如果当前长度的木棒不行,那后面相同长度的木棒也肯定不行,直接跳过。while(i+1<n&&a[i+1].equals(a[i])){i++;}}returnfalse;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 11:11:26

【如何快速开发特种设备数字孪生应用平台】

如何快速开发特种设备数字孪生应用平台一、 明确业务目标与设备类型 二、 技术架构设计&#xff08;分层架构&#xff09; 三、 快速开发策略 四、 典型开发流程&#xff08;6~12周&#xff09; 五、 推荐工具栈&#xff08;国产优先&#xff09;#快速开发策略#低代码与微…

作者头像 李华
网站建设 2026/8/21 20:14:11

速来体验 | 1Panel应用商店上架阿里开源个人AI助理CoPaw

2026年2月28日&#xff0c;阿里巴巴开源生态的个人AI助理CoPaw上新至1Panel应用商店&#xff0c;广大社区用户可以通过1Panel应用商店快速部署并体验这款最新研发的桌面智能体工具。截至2026年3月2日14:00&#xff0c;CoPaw成功进入1Panel应用商店下载榜日榜&#xff0c;并排名…

作者头像 李华
网站建设 2026/8/21 18:51:50

CMake基础: 全局变量CMAKE_POSITION_INDEPENDENT_CODE

目录 1.简介 2.CMake 配置方式 3.注意事项 4.与 BUILD_SHARED_LIBS 的关系 1.简介 这是 CMake 全局变量&#xff0c;用来统一控制是否默认生成 位置无关代码&#xff08;-fPIC&#xff09;。这是构建共享库 (Shared Libraries, .so/.dll) 的必要条件。 核心作用&#xff1a…

作者头像 李华
网站建设 2026/8/21 18:55:26

AAAI 2026 Oral|论文解读:针对LLM外部推理的因果奖励调整方法

点击蓝字关注我们AI TIME欢迎每一位AI爱好者的加入&#xff01;点击阅读原文查看作者讲解近日&#xff0c;实验室研究团队的论文“Causal Reward Adjustment: Mitigating Reward Hacking in External Reasoning via Backdoor Correction”被人工智能会议大会&#xff08;The 40…

作者头像 李华