59 叠积木

#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;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值