当前位置: 首页 > news >正文

AcW木棒-XMUOJ恢复破碎的符咒木牌-DFS与剪枝

题目

思路

话不多说,直接上代码

代码

/*
AcW木棒-XMUOJ恢复破碎的符咒木牌 
搜索顺序:从小到大枚举最终的长度 len从前往后依次拼每根长度为len的木棍 
优化:
1.优化搜索顺序:优先选择深度短的来搜索,故从大到小去枚举
2.排除冗余的方案:每一根长木棍的内部的编号递增(排列方案变为组合方案)、
3.可行性剪枝:(1)当前第i根木棍失败,跳过与当前木棍长度相等的其他木棍 (2)拼了几根长木棍后,要拼新的木棍,第一个未被用过的木棍,如果作为新长木棍的第一段,无解,则直接回溯(3)拼了几根长木棍后,要拼最后一段的木棍,当前小木棍加入使得当前长木棍满足,但是剩余的木棒拼不出长木棒,无解,回溯 
*/
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=70;
int w[N];//当前木棍的长度 
bool st[N];//是否用过
int sum,len; //当前木棍的总长度,枚举的长度 
int n;
//u:当前正在构造第几根长木棍
//cur:当前正在拼的长木棍的长度
//start: 当前长木棍中小木棍的下标 
bool dfs(int u,int cur,int start){if(u*len==sum)return true;//排完所有的小木棍了 if(cur==len)return dfs(u+1,0,0);//当前长木棍已经排好 for(int i=start;i<n;i++){if(st[i] )continue;//如果已经用过 if(cur+w[i]<=len){st[i]=true;if(dfs(u,cur+w[i],i+1)) return true;st[i]=false;//恢复现场 }if(!cur||cur+w[i]==len) return false;//到达这一步说明前面已经无解 int j=i;while(j<n&&w[i]==w[j])j++;//把与i相等的跳过i=j-1;//恢复下标 } return false;
}int main(){while(cin>>n,n){sum=len=0;for(int i=0;i<n;i++){cin>>w[i];sum+=w[i];len=max(len,w[i]);} sort(w,w+n,greater<int>()); memset(st,0,sizeof st);while(true){if(sum%len==0&&dfs(0,0,0)){cout<<len<<endl;break;}len++;}}return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • JVM(5):虚拟机性能分析和故障解决工具概述
  • WebSocket——相关介绍以及后端配置
  • 作文笔记9 描写方法
  • unity开发Hololens,使用unity自带的UGUI
  • k8s命令式对象管理和配置
  • 《计算机网络微课堂》2-3 传输方式
  • Python 点云平面分割【RANSAC算法】
  • Python案例题目,入门小白题
  • 安卓分身大师4.6.0解锁会员安卓14可用机型伪装双开多开
  • Git使用笔记
  • 蓝桥杯杨辉三角
  • 安卓手机APP开发__近距离无线通信(NFC)概述
  • WordPress Country State City Dropdown CF7插件 SQL注入漏洞复现(CVE-2024-3495)
  • 12秒窃走2500万美元加密货币,麻省理工毕业的黑客两兄弟被捕
  • 【杂七杂八】Huawei Gt runner手表系统降级
  • [iOS]Core Data浅析一 -- 启用Core Data
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • [译]Python中的类属性与实例属性的区别
  • CSS3 变换
  • IndexedDB
  • js
  • JSONP原理
  • Leetcode 27 Remove Element
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • V4L2视频输入框架概述
  • Vue.js-Day01
  • 关于字符编码你应该知道的事情
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 前端之Sass/Scss实战笔记
  • -- 数据结构 顺序表 --Java
  • 数组的操作
  • 用Visual Studio开发以太坊智能合约
  • 最近的计划
  • C# - 为值类型重定义相等性
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • #mysql 8.0 踩坑日记
  • #QT(智能家居界面-界面切换)
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • $.ajax()参数及用法
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (NSDate) 时间 (time )比较
  • (python)数据结构---字典
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (利用IDEA+Maven)定制属于自己的jar包
  • (三)SvelteKit教程:layout 文件