叠积木~~~

#include <iostream>

#include <vector>

#include <string>

#include <sstream>

#include <algorithm>

using namespace std;

// 深度优先搜索函数

bool dfs(const vector<int>& bricks, int currentIndex, int usedLayers, vector<int>& layerLengths, int maxLayers, int targetLength)

{

// 当所有积木都已使用完时,返回 true

if (currentIndex < 0)

{

return true;

}

// 当前层还未堆满,继续往上堆

if (usedLayers < maxLayers)

{

layerLengths[usedLayers] = bricks[currentIndex];

if (dfs(bricks, currentIndex - 1, usedLayers + 1, layerLengths, maxLayers, targetLength))

{

return true;

}

layerLengths[usedLayers] = 0;

}

// 把当前积木加入已有的每一层中,看是否能够满足条件

for (int i = 0; i < usedLayers; i++)

{

// 如果当前层和上一层积木长度相同,则不需要重复计算

if (i > 0 && layerLengths[i] == layerLengths[i - 1])

{

continue;

}

// 如果当前积木可以放入当前层,则把当前积木放入当前层

if (layerLengths[i] + bricks[currentIndex] <= targetLength)

{

layerLengths[i] += bricks[currentIndex];

if (dfs(bricks, currentIndex - 1, usedLayers, layerLengths, maxLayers, targetLength))

{

return true;

}

layerLengths[i] -= bricks[currentIndex];

}

}

return false;

}

int main()

{

// 读取输入

string inputStr;

getline(cin, inputStr);

istringstream iss(inputStr);

vector<int> bricks;

int brick;

while (iss >> brick)

{

bricks.push_back(brick);

}

// 计算所有积木的总长度

int totalLength = 0;

for (int brick : bricks)

{

totalLength += brick;

}

// 对积木长度进行排序

sort(bricks.begin(), bricks.end());

int maxLayers = -1;

// 遍历所有可能的层数

for (int i = 2; i <= totalLength; i++)

{

// 如果所有数字的和除不尽层数,自然肯定不满足条件

if (totalLength % i != 0)

{

continue;

}

// 计算每一层的目标长度

int targetLength = totalLength / i;

// 如果最大的积木长度大于当前层的长度,则无法满足条件

if (bricks.back() > targetLength)

{

continue;

}

// 初始化每层的长度列表

vector<int> layerLengths(i, 0);

// 使用深度优先搜索判断是否可以堆成满足条件的墙

if (dfs(bricks, bricks.size() - 1, 0, layerLengths, i, targetLength))

{

maxLayers = max(maxLayers, i);

}

}

// 输出最大层数

cout << maxLayers << endl;

return 0;

}

相关推荐
咖啡里的茶i17 分钟前
视觉显著目标的自适应分割与动态网格生成算法研究
人工智能·算法·目标跟踪
paeamecium32 分钟前
【PAT甲级真题】- String Subtraction (20)
数据结构·c++·算法·pat考试·pat
YL2004042637 分钟前
047从前序与中序遍历序列构造二叉树
算法·leetcode
极梦网络无忧39 分钟前
password_hash
算法·哈希算法
计算机安禾1 小时前
【c++面向对象编程】第25篇:仿函数(函数对象):重载operator()
开发语言·c++·算法
周末也要写八哥2 小时前
在C++中使用预定义宏
开发语言·c++·算法
学会870上岸华师2 小时前
C 语言程序设计——第一章课后编程题
c语言·开发语言·学习·算法
小马过河R2 小时前
RAG检索优化策略:系统性四层框架解析
人工智能·python·算法·ai·llm·rag·问答
AI技术控3 小时前
论文解读:AE-TCN-SA——基于自编码器、TCN 与自注意力机制的锂电池内短路诊断方法
人工智能·python·深度学习·算法·机器学习·自然语言处理
ʚ希希ɞ ྀ3 小时前
动态规划基础知识---爬楼梯
算法·动态规划