木棍【dfs搜索优化】

木棒

题目描述

在这里插入图片描述

输入样例:

9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0

输出样例:

6
5

【思路】

优化
在这里插入图片描述

在这里插入图片描述

【AC代码】

#include <iostream>
#include <algorithm>
#include <cstring>using namespace std;const int N = 70;int w[N], sum, length, n;
bool st[N];bool dfs(int u, int cur, int start) {	//当前拼接木棒个数,当前木棒长度 ,从第几个已有木棒进行枚举搜索 if(u * length == sum)	return true;// 如果当前木棒的数量 * 长度 = sum,则找到了答案,直接返回 trueif(cur == length) return dfs(u + 1, 0, 0);// 如果当前木棒的长度等于了 length,则新开一根木棒// 否则枚举从 start 开始枚举将哪根木棍拼到当前木棒中for(int i = start; i < n; i ++) {//若已经搜索过 if(st[i] || cur + w[i] > length)	continue;//若没有搜索过st[i] = true;// 继续搜索当前木棒的下一根木棍拼哪根if(dfs(u, cur + w[i], i + 1))	return true;//恢复现场st[i] = false;// 执行到这 dfs(u, s + w[i], i + 1) 为 false: 说明当前木棍搜索失败了//继续进行剪枝优化//如果第一根或者最后一根搜索失败,那么一定失败if(cur == 0 || cur + w[i] == length)	return false;int j = i;
// 		如果当前木棍没有搜到方案,则跳过所有长度相等的木棍while(j < n && w[j] == w[i])	j ++;i = j - 1; }	//若是上边没有匹配成功,则返回失败return false;
}int main() {while(cin >> n, n) {memset(st, 0, sizeof st);sum = 0, length = 1; // 每根木棒的长度从 1 开始枚举,从小到大枚举,题目要求分组最多,那么第一个满足条件的就是答案for(int i = 0; i < n; i ++) {cin >> w[i];sum += w[i];}//从大到小枚举,减少搜索分支 sort(w, w + n, greater<int>());while(true) {// 循环一定会退出,最坏情况下所有木棍拼一根木棒if(sum % length == 0 && dfs(0, 0, 0)) {cout << length << endl;break;}length++;// 当前 length 无法得到答案,则长度 + 1}}return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/794303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云邮件服务器多少钱?邮件服务器租用费用

阿里云邮件服务器租用费用&#xff0c;2核2G3M带宽99元一年、2核4G4M服务器199元一年&#xff0c;不只是云服务器ECS&#xff0c;还可以选择轻量应用服务器。 0、在阿里云CLUB中心领取 aliyun.club 当前最新的优惠券和服务器报价单 1、阿里云服务器ECS经济型e实例&#xff0c;2…

【BPNN】BP神经网络代码

主代码 function main() clc clear close all %% 1.原始数据 %输入 SR1[20.55 22.44 25.37 27.13 29.45 30.10 30.96 34.06 36.42 38.09 39.13 39.99 ...41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63]; SR2[0.6 0.75 0.85 0.9 1.05 1.35 1.45 1.6 1.7 1.85 2.15 2.2 2.25…

eNSP配置命令笔记

配置命令 一、基本命令二、静态路由 参考博文&#xff1a;博文1、博文2 一、基本命令 undo terminal monitor //在用户视图执行&#xff0c;关闭终端的告警或日志显示 system-view //进入系统视图,简化sys sysname <name> //修改设备名称interface <接口名(g0/0/…

专题三——二分算法

目录 原理 模板 朴素二分算法 非朴素二分算法 一二分查找 二在排序数组中查找元素的第一个和最后一个位置 三点名 四x的平方根 五搜索插入位置 六山脉数组的峰顶索引 七寻找峰值 八寻找旋转排序数组中的最小值 原理 定义两个指针&#xff1a;left指向数组第一个元…

如何看到 synchronized 背后的“monitor 锁”?

Java全能学习+面试指南:https://javaxiaobear.cn 获取和释放 monitor 锁的时机 我们都知道,最简单的同步方式就是利用 synchronized 关键字来修饰代码块或者修饰一个方法,那么这部分被保护的代码,在同一时刻就最多只有一个线程可以运行,而 synchronized 的背后正是利用 …

ACWing: 1049 大盗阿福

#暴力bfs&#xff1a; """ 题目描述 阿福是一名经验丰富的大盗。趁着月黑风高&#xff0c;阿福打算今晚洗劫一条街上的店铺。 这条街上一共有 N家店铺&#xff0c;每家店中都有一些现金。 阿福事先调查得知&#xff0c;只有当他同时洗劫了两家相邻的店铺时&…

Redis -- 缓存雪崩问题

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力。 可能原因 : 同一时间大量的key到期 ; 解决方案&#xff1a; 给不同的Key的TTL添加随机值 利用Redis集群提高服务的可用性 给缓存业务添加降…

渗透测试靶机----Raven-1

渗透测试靶机----Raven-1 开启靶机&#xff0c;登录窗&#xff0c;平平无奇 开扫&#xff1a; 先看看ip 这里发现192.168.217.166 发现相关服务端口&#xff0c;这里看到80&#xff0c;还是老样子&#xff0c;先80入手打开发现一个熟悉的站点&#xff1a; 这里可以使用漏扫工具…

Python你想要修改文件内容的同时保留原文件的元数据(如创建时间、修改时间等)

在Python中&#xff0c;如果你想要修改文件内容的同时保留原文件的元数据&#xff08;如创建时间、修改时间等&#xff09;&#xff0c;你需要先读取原文件的内容&#xff0c;然后创建一个新的文件写入修改后的内容&#xff0c;同时复制原文件的元数据到新文件上。然而&#xf…

ES学习日记(五)-------插件head安装

接上回,必要的git和node已经装完了,现在开始装head 回到es集群项目里找到plugins(插件文件夹下), 存在安装在plugins启动es报错的情况,报错信息如图一,解决方案就是换个目录,不要放在plugin目录下 git clone https://github.com/mobz/elasticsearch-head.git 打开远程登陆,默…

装饰器深入剖析

装饰器核心 概念 装饰器来自 Decorator 的直译。什么叫装饰&#xff0c;就是装点、提供一些额外的功能。在 python 中的装饰器则是提供了一些额外的功能。 装饰器本质上是一个Python函数&#xff08;其实就是闭包&#xff09;&#xff0c;它可以让其他函数在不需要做任何代码…

【动手学深度学习】深入浅出深度学习之RMSProp算法的设计与实现

目录 &#x1f31e;一、实验目的 &#x1f31e;二、实验准备 &#x1f31e;三、实验内容 &#x1f33c;1. 认识RMSProp算法 &#x1f33c;2. 在optimizer_compare_naive.py中加入RMSProp &#x1f33c;3. 在optimizer_compare_mnist.py中加入RMSProp &#x1f33c;4. 问…

atoi()函数---使用和模拟实现(详解)

目录 一、前言二、声明三、描述四、参数五、返回值六、使用七、模拟实现 一、前言 二、声明 int atoi(const char *str)三、描述 C 库函数 int atoi(const char *str) 把参数 str 所指向的字符串转换为一个整数&#xff08;类型为 int 型&#xff09;需要包含头文件&#xff…

大语言模型基石:文字与数字的起源与演变

大语言模型基石&#xff1a;文字与数字的起源与演变 1、文字 1.1、起源 我们的祖先在还没有发明文字和语言之前就已经开始使用“咿咿呀呀”的声音来传播信息了&#xff0c;比如在野外活动遇到危险&#xff0c;然后发出“咿咿呀呀”的声音来提醒同伴小心&#xff0c;同伴在接收…

考古:IT架构演进之IOE架构

考古&#xff1a;IT架构演进之IOE架构 IOE架构&#xff08;IBM, Oracle, EMC&#xff09;出现在20世纪末至21世纪初&#xff0c;是一种典型的集中式架构体系。在这个阶段&#xff0c;企业的关键业务系统往往依赖于IBM的小型机&#xff08;后来还包括大型机&#xff09;、Oracle…

基于SpringBoot+Vue的儿童书法机构管理系统

一、项目背景介绍&#xff1a; 儿童书法机构的管理是一个具有挑战性的任务&#xff0c;需要有效的信息管理和资源分配。传统的手动管理方式存在着效率低下、易出错等问题。为了解决这些问题&#xff0c;基于SpringBootVue的儿童书法机构管理系统应运而生。该系统利用现代化的技…

Linux--进程(2)

目录 前言 1. 进程的状态 1.1 进程排队 1.2 运行&#xff0c;阻塞&#xff0c;挂起 2.Linux下具体的进程状态 2.1僵尸和孤儿 3.进程的优先级 4.Linux的调度与切换 前言 这篇继续来学习进程的其它知识 上篇文章&#xff1a;Linux--进程&#xff08;1&#xff09;-CS…

ES12 学习

文章目录 1. 逻辑赋值操作符2. 数字分隔符_3. replaceAll4. Promise.any5. WeakRefs6. FinalizationRegistry 1. 逻辑赋值操作符 逻辑赋值操作符 ??、&&、|| let a true let b true a && b // a a && b a || b // a a || b obj.introduction ?…

37.ABA问题

变量初始值为A&#xff0c;修改成B,通过AtomicReference的compareAndSet去改变。就会先比较原来的值是否为A&#xff0c;如果为A则修改成功&#xff0c;否则修改失败。 但是如果在这个过程中&#xff0c;A变成D然后又变成A, 那么再调用compareAndSet去改变也能修改成功B。这个…

Redis -- 缓存击穿问题

缓存击穿问题也叫热点Key问题&#xff0c;就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了&#xff0c;无数的请求访问会在瞬间给数据库带来巨大的冲击。 常见的解决方案有两种&#xff1a; 互斥锁 逻辑过期 逻辑分析&#xff1a;假设线程1在查询缓存之后&…