计蒜客蓝桥杯模拟赛5 礼物盒

本文介绍了一个具体的算法问题:如何在限定尺寸的柜子里尽可能多地放置特定尺寸的礼物盒,要求礼物盒不能堆叠且柜子两侧不留空隙。通过使用贪心算法策略,实现了最优解的求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:
第七题
小y 有一个宽度为 100cm,高度为 20cm,深度为 1cm 的柜子,如下图。
这里写图片描述

小y 还有 3636 个礼物盒,他们的深度都为 1cm。
他们对应的宽度和高度如下,单位(cm)。
这里写图片描述
现在小y 想把这些盒子放到柜子上,由于礼物盒里面都装有礼物,礼物盒必须向上放置,并且不能堆放。由于礼物盒深度和柜子深度一样,所以礼物盒和柜子深度方向也必须一致。并且礼物盒的高度还不能大于柜子的高度,否者放不进去。小y 希望放到柜子上礼物盒的宽度和正好等于柜子的宽度,也就是希望柜子两边都不存在间隙。如下图符合条件的放置。
这里写图片描述
满足条件的情况下,小y 希望能尽可能多的放置礼物盒,算出最多能放多少个礼物盒。

思路:贪心

#include <stdio.h>
#include<algorithm>
using namespace std;
#include<string.h>
int widths[] = {11,8,11,16,1,2,6,10,17,10,6,5,2,19,4,
            7,5,5,15,3,15,11,9,17,9,4,10,12,17,19,20,11,10,20,3};
int p[20];
void dfs(int n,int sum,int step){
    if(sum==100){
        int s = 0;
        for(int i = 0;i<20;i++){
            if(p[i]>0)s++;
        }
        printf("%d\n",s);
        exit(0);
    }else if(sum>100)return;

    for(int i = n;i<35;i++){
        p[step] = widths[n];
        dfs(i+1,sum+widths[n],step+1);
        p[step] = 0;
    }
}
int main() {

    sort(widths,widths+35);
    dfs(0,0,0);
    return 0;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值