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

server/2024/11/14 6:25:53/

题目

思路

话不多说,直接上代码

代码

/*
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;
}

http://www.ppmy.cn/server/43018.html

相关文章

Linux网络编程:HTTP协议

前言&#xff1a; 我们知道OSI模型上层分为应用层、会话层和表示层&#xff0c;我们接下来要讲的是主流的应用层协议HTTP&#xff0c;为什么需要这个协议呢&#xff0c;因为在应用层由于操作系统的不同、开发人员使用的语言类型不同&#xff0c;当我们在传输结构化数据时&…

XILINX FPGA DDR 学习笔记(一)

DDR 内存的本质是数据的存储器&#xff0c;首先回到数据的存储上&#xff0c;数据在最底层的表现是地址。为了给每个数据进行存放并且在需要的时候读取这个数据&#xff0c;需要对数据在哪这个抽象的概念进行表述&#xff0c;我们科技树发展过程中把数据在哪用地址表示。一个数…

JVM-调优之-高内存占用问题排查

排查思路 1&#xff09;检查jvm内存的分配情况 2&#xff09;检查jvm的gc情况 3&#xff09; 找出占用量比较大的对象 第一步&#xff1a;jmap -heap PID 查看jvm内存使用情况 jmap -heap 2525 可以看到老年代年轻代等其他内存区域内存使用率百分比 第二步&#xff1a;jsta…

算法训练营第三十九天 | LeetCode 738 单调递增的数字、LeetCode 968 监控二叉树

LeetCode 738 单调递增的数字 这题类似模拟&#xff0c;可以找出如下规律&#xff1a; 先将数字按位数从高位到低位存到一个整型数组中。在这个数组中&#xff0c;从左往右遍历&#xff0c;如果遇到一个两数相等&#xff0c;并且记录的这个变量之前没有赋过值&#xff0c;那么…

MySQL-----事务(详解)

目录 一.事务简介&#xff1a; 二.事务操作&#xff1a; 未控制事务&#xff1a; 事务的控制方法一&#xff1a; 事务的控制方法二&#xff1a; 三&#xff1a;事务的四大特性&#xff1a; 四.并发事务问题&#xff1a; 五.事务的隔离级别&#xff1a; 一.事务简介&#…

Docker | 基础指令

环境&#xff1a;centos8 参考&#xff1a; 安装 Docker | Docker 从入门到实践https://vuepress.mirror.docker-practice.com/install/ 安装Docker 卸载旧版本&#xff0c;安装依赖包&#xff0c;添加yum软件源&#xff0c;更新 yum 软件源缓存&#xff0c;安装 docker-ce…

H3CNE-6-ICMP数据包分析

ICMP&#xff1a;Internet Control Message Protocol ICMP用来传递差错、控制、查询等信息 Wireshark抓包 Wireshark下载国内镜像 ICMP数据包格式 Type&#xff1a;表示ICMP消息类型 Code&#xff1a;表示同一消息类型中的不同信息 ICMP消息类型和编码类型 ICMP应用 &…

如何在Ubuntu上安装NVIDIA显卡驱动并禁止自动更新

在Ubuntu上安装NVIDIA显卡驱动后&#xff0c;有时为了避免兼容性问题或驱动稳定性问题&#xff0c;可能需要禁止自动更新显卡驱动。本文将逐步介绍如何在Ubuntu上安装NVIDIA显卡驱动&#xff0c;并配置系统以禁止驱动的自动更新。 1. 准备工作 在开始之前&#xff0c;请确保你…