AcWing167. 木棒(DFS+剪枝)

2023-11-05

 

输入样例:
9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0
输出样例:
6
5

解析:

        DFS 搜索顺序:根据木棒的长度从小到大枚举每根木棒,对于每根木棒,枚举可以由哪些木棍拼成,如果所有的木棍拼成了长度相等的多个木棒,说明找到了答案,否则木棒长度加 1 继续搜索。
        因为题目要求保证拼凑成功的前提下,还有分组尽可能少,即木棒数量尽可能少,所以我们从小到大枚举每根木棒的长度,第一次找到答案时就是最优解。

剪枝优化:

剪枝 1:sum % length == 0 只有 length 是 sum 的约数才有可能凑出多个等长的木棒
剪枝 2:优化搜索顺序,木棍长度从大到小排序,可以减少搜索的分支排除等效冗余优化
剪枝 3-1:确定每根木棒中木棍的枚举顺序,因为我们的方案和顺序没有关系,以组合的形式枚举方案可以少搜很多重复方案
剪枝 3-2:如果当前木棍没有搜到方案,则跳过所有长度相等的木棍
剪枝 3-3:如果是木棒的第一根木棍就搜索失败了,则一定搜不到方案
剪枝 3-4:如果是木棒的最后一根木棍(+ 上它木棒长度正好是 length)搜索失败了,也一定搜不到方案

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=65;
int n,sum,a[N],vis[N],now;			//u为当前已经排好的木棒数量 
bool dfs(int u,int t,int f){		//t为当前根已经排好的长度,f为起始搜索的索引 
	if(u*now==sum) return true;		//如果当前的根数 * 此次枚举的单根长度 = 总长度,则成功 
	if(t==now) return dfs(u+1,0,1);	//这一根完成,新开一根 
	for(int i=f;i<=n;i++){			
		if(vis[i]) continue;
		if(t+a[i]<=now){
			vis[i]=1;
			if(dfs(u,t+a[i],i+1)) return true;
			vis[i]=0;
			//执行到这 dfs(u, s + w[i], i + 1) 为 false: 说明当前木棍搜索失败了
				
			//果是木棒的第一根木棍就搜索失败了,则一定搜不到方案
			if(t==0) return 0;
			
			//果是木棒的第一根木棍就搜索失败了,则一定搜不到方案
			if(t+a[i]==now) return 0;
			
			//如果当前木棍没有搜到方案,则跳过所有长度相等的木棍
			while(i+1<=n&&a[i+1]==a[i]) i++;
		}
	}
	return 0;
}
int main(){
	while(cin>>n){
		if(n==0) break;
		sum=0;
		for(int i=1;i<=n;i++){
			scanf("%d",&a[i]);
			sum+=a[i];			//求和 
		}
		sort(a+1,a+n+1);	
		reverse(a+1,a+n+1);		//按照由大到小排列 
		for(int i=1;i<=sum;i++){
			memset(vis,0,sizeof vis);
			now=i;
			if(sum%now==0&&dfs(0,0,1)){		//总长度必定整除每根长度 
				cout<<now<<endl;
				break;
			}
		}
	}
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AcWing167. 木棒(DFS+剪枝) 的相关文章

  • 是否有与 posix_memalign 对应的 C++ 版本?

    当我打电话时posix memalign http man7 org linux man pages man3 posix memalign 3 html为类型的对象分配对齐的内存Foo在我的 C 代码中 我需要做一个reinterpret
  • C++ 维护子类对象的混合集合

    如果我在这里错过了一个相当基本的概念 我很抱歉 但我正在尝试弄清楚如何维护多个类类型的集合 所有类类型都派生自同一个父类 并且在检索它们时仍然可以访问它们的特定于子类的方法从集合中 作为上下文 我有一个基类 BaseClass 和许多类 例
  • 为什么在连接两个字符串时 Python 比 C 更快?

    目前我想比较 Python 和 C 用来处理字符串的速度 我认为 C 应该比 Python 提供更好的性能 然而 我得到了完全相反的结果 这是 C 程序 include
  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 为什么从字典中获取时会得到 Action<> 的克隆?

    我有以下字典 private Dictionary
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • Qt制作简单的无边框登陆窗口

    使用qt做简单的登录窗口 环境 win10 Qt5 创建项目 选择Widget类 勾选ui界面 因为我是用的默认类名所以类名是Widget 以下是Widget h ifndef WIDGET H define WIDGET H includ
  • 离散方法介绍

    离散成 的方法存在很多 但是各个方法直接存在优劣 从两方面进行参数比较 方面 1 从零点和极点 2 环节的频率响应 幅频和相频特性 系统控制方面 评价离散方法的参数 1 主导零 极点 2 系统带宽或者穿越频率 3 直流增益 4 增益裕度 5
  • Python采集世界大学排行榜,做数据可视化,来看看你的大学上榜没

    前言 这不是最近疫情又开始了 马上也要过年了 就是说很多大学都开始准备放假了吧 我有个表妹下周二就放寒假了哈哈 感觉现在读书寒假可长了 今天有点无聊 就来 爬取一下世界大学排行榜 做数据可视化 看看你们的学校上榜没 知识点 动态数据抓包 r
  • Algorithm oj 全集(已过oj)

    Algorithm oj 分治策略 作业1 找出数组中第 k 小的数 总提交数 616次 通过数 188次 通过率 30 52 内存限制 104857600 BYTE 时间限制 10000 MS 输入限制 1000 行 输出限制 1000
  • 【我的面试-01】Web前端开发实习岗-面试题总结

    简单开头 首先技术面试官会根据简历里所写的项目和个人掌握技术栈提问 我不知道已经改过多少次简历了 因为前期投简历是真的是沉在茫茫大海 捞漂流瓶都捞不到的那种 我的技术栈 Vue还在苦苦的自学当中 随便推荐一下coderwhy老师B站的教学视
  • 通过反射获取一个对象的属性值三种方法比较

    这里写目录标题 为何要写这篇博客 数据准备 方法实践 总结 为何要写这篇博客 反射机制的用途非常多 比如获取方法 属性名和属性值等 甚至可以获取标签等标签属性 今天来比较几种获取实例化对象的属性值方法 数据准备 Builder FieldD
  • C++的cout高阶格式化操作

    敬告 当您的浏览器以非默认字体浏览本文时 段落格式可能会出现偏差 这篇文章主要讲解如何在C 中使用cout进行高级的格式化输出操作 包括数字的各种计数法 精度 输出 左或右对齐 大小写等等 通过本文 您可以完全脱离scanf printf
  • 攻防世界-WEB新手练习区教程(二)

    目录 攻防世界 WEB新手练习区教程 二 simple js xff referer weak auth command execution simple php 攻防世界 WEB新手练习区教程 二 simple js 进入场景 需要输入密
  • 记忆化搜索 Memorization Search

    记忆化搜索 Memorization Search 什么是记忆化搜索 记忆化搜索函数的三个特点 记忆化搜索 vs 动态规划 三种适用于DP的场景 三种不适用于DP的场景 Examples Leetcode 140 单词拆分 II Leetc
  • print.js 打印的网页单页内容,多出第二页空白页面

    问题如上图 解决过程 给table外嵌套的div设置了样式page break after也没有效果 最后索性给打印区域添加加边框 准备看看预览时空白页里有什么 结果后一页的空白页就这么没了 o 观察发现 加上边框后 table的宽度确实有
  • 【js】用正则实现一串数字用逗号隔开千分位

    此方法适用于正整数 负整数 浮点数 const formatNumberWithCommas number any gt 兼容一下传进来的number字段有可能是null undefined NaN 0的情况 当number为null un
  • .NET基础概念解释及主要体系结构

    一 NET概念详解 1 NET NET就是微软用来实现XML Web Services SOA 面向服务的体系结构service orientedarchitecture 和敏捷性的技术 NET是微软的新一代技术平台 为敏捷商务构建互联互通
  • python无web框架接口通信

    1 发送 def image to base64 image np image cv2 imencode jpg image np 1 tobytes base64 data base64 b64encode image base64 da
  • Java解析txt文件

    Java解析txt文件 package com wb test import java io BufferedReader import java io File import java io FileInputStream import
  • mysql和c#在类型转换的问题

    1 char 36 和string mysql在将char 36 类型的会转成System GUID 如果char 36 字段里存的不是guid 最好不要用char 36 改成char 37 这样的就没事了 在 net开放中 asp net
  • 李晓波

    一 大败局 第一部 这套书 真的写出来改革开放以来 中国比较出名的企业的生存与失败 这套书可以指导我十年吧 这几本书应该每两年翻阅一遍 1 秦池酒的成功与失败 中国标王 广告对普通人的影响 公关 品牌营销 2013 11 20 二 中国经济
  • cygwin环境编译 致命错误:stddef.h:can not found

    最近需要在linux下运行代码 为了省去搭建环境的时间 就使用了cygwin这一工具 但它在编译过程中 出现了can not found stddef h的问题 原因是库文件sttdef h没有找到 上网查了一下 有的博客写到需要对g 降级
  • 使用MongoDB命令连接远程服务器的MongoDB数据库

    使用MongoDB命令连接远程服务器的MongoDB数据库 MongoDB连接远程服务器的命令格式如下 mongo 远程主机ip或DNS MongoDB端口号 数据库名 u user p password MongoDB连接远程服务器的命令
  • LeetCode 每日一题 2023/9/11-2023/9/17

    记录了初步解题思路 以及本地实现代码 并不一定为最优 也希望大家能一起探讨 一起进步 目录 9 11 630 课程表 III 9 12 1462 课程表 IV 9 13 2596 检查骑士巡视方案 9 14 1222 可以攻击国王的皇后 9
  • AcWing167. 木棒(DFS+剪枝)

    输入样例 9 5 2 1 5 2 1 5 2 1 4 1 2 3 4 0 输出样例 6 5 解析 DFS 搜索顺序 根据木棒的长度从小到大枚举每根木棒 对于每根木棒 枚举可以由哪些木棍拼成 如果所有的木棍拼成了长度相等的多个木棒 说明找到了