2017年蓝桥杯模拟赛-7礼物盒

本文通过深度优先搜索算法解决了一个具体的盒子填充问题,旨在寻找能够完全填满固定尺寸柜子的最大数量盒子组合。

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



小y 有一个宽度为 100cm,高度为 20cm,深度为 1cm 的柜子,如下图。

小y 还有 363636 个礼物盒,他们的深度都为 1cm。

他们对应的宽度和高度如下,单位(cm)。

 
 
1
11 3
2
8 12
3
11 17
4
16 13
5
1 14
6
2 8
7
6 10
8
10 18
9
17 11
10
10 15
11
6 14
12
5 6
13
2 19
14
19 10
15
4 9
16
7 9
17
5 14
18
5 20
19
15 19
20
3 17
21
15 11
22
7 25
23
11 20
24
9 12
25
17 4
26
9 19
27
4 18
28
10 10
29
12 19
30
17 3
31
19 9
32
20 16
33
11 16
34
10 2
35
20 15
36
3 14

数据可以参考 礼物盒的数据

现在小y 想把这些盒子放到柜子上,由于礼物盒里面都装有礼物,礼物盒必须向上放置,并且不能堆放。由于礼物盒深度和柜子深度一样,所以礼物盒和柜子深度方向也必须一致。并且礼物盒的高度还不能大于柜子的高度,否者放不进去。小y 希望放到柜子上礼物盒的宽度和正好等于柜子的宽度,也就是希望柜子两边都不存在间隙。如下图符合条件的放置。

满足条件的情况下,小y 希望能尽可能多的放置礼物盒,算出最多能放多少个礼物盒。


#include <stdio.h>
int main() {
    printf("%d\n",
    // 在下方填入答案
    
    );
    return 0;
}



使用DFS深度遍历搜索:

#include <iostream>

using namespace std;

int box[36][2]={
{11,3},{8,12},{11,17},{16,13},{1,14},{2,8},
{6,10},{10,18},{17,11},{10,15},{6,14},{5,6},
{2,19},{19,10},{4,9},{7,9},{5,14},{5,20},
{15,19},{3,17},{15,11},{7,25},{11,20},{9,12},
{17,4},{9,19},{4,18},{10,10},{12,19},{17,3},
{19,9},{20,16},{11,16},{10,2},{20,15},{3,14}};

int sum=0;//盒子的总数


//count:盒子的数量,width:现在的宽度,i:数组的行数(数据的个数)
void dfs(int count,int width,int i)
{
    if(width==100)//先判断是否满足目标状态(width==100),如果是的话,do something
    {
        if(count>sum)
        {
            sum=count;
        }
        return;//如果是目标状态,就return吧
    }
    if(width>100||i>35)//判断该状态是否合法,不合法return掉
    {
        return;
    }

    if(box[i][1]<=20)//判断是否高度小于20
    {
        dfs(count+1,width+box[i][0],i+1);//进入新状态
    }
    dfs(count,width,i+1);//进入新状态

}

int main()
{

    dfs(0,0,0);//DFS的初始状态

    cout<<sum;
    return 0;
}




#include <iostream>

using namespace std;

int box[36][2]=
{
    {11,3},{8,12},{11,17},{16,13},{1,14},{2,8},
    {6,10},{10,18},{17,11},{10,15},{6,14},{5,6},
    {2,19},{19,10},{4,9},{7,9},{5,14},{5,20},
    {15,19},{3,17},{15,11},{7,25},{11,20},{9,12},
    {17,4},{9,19},{4,18},{10,10},{12,19},{17,3},
    {19,9},{20,16},{11,16},{10,2},{20,15},{3,14}
};

int sum=0;//盒子的总数


//count:盒子的数量,width:现在的宽度,i:数组的行数(数据的个数)
void dfs(int count,int width,int i)
{

    if(width==100)//先判断是否满足目标状态(width==100),如果是的话,do something
    {
        if(count>sum)
        {
            sum=count;
        }
        return;//如果是目标状态,就return吧
    }
    if(width>100||i>35)//判断该状态是否合法,不合法return掉
    {
        return;
    }

    if(box[i][1]<=20)//判断是否高度小于20
    {
        dfs(count+1,width+box[i][0],i+1);//进入新状态
        //如果width+box[35][0]刚好==100,i+1==36,这个状态也是合法的
    }
    dfs(count,width,i+1);//进入新状态

}

int main()
{

    dfs(0,0,0);//DFS的初始状态

    cout<<sum;
    return 0;
}


/*************************************************************************************************************/
/*
#include <iostream>

using namespace std;

int box[36][2]=
{
    {11,3},{8,12},{11,17},{16,13},{1,14},{2,8},
    {6,10},{10,18},{17,11},{10,15},{6,14},{5,6},
    {2,19},{19,10},{4,9},{7,9},{5,14},{5,20},
    {15,19},{3,17},{15,11},{7,25},{11,20},{9,12},
    {17,4},{9,19},{4,18},{10,10},{12,19},{17,3},
    {19,9},{20,16},{11,16},{10,2},{20,15},{3,14}
};

int sum=0;//盒子的总数


//count:盒子的数量,width:现在的宽度,i:数组的行数(数据的个数)
void dfs(int count,int width,int i)
{
    if(width>100||i>35+1)//判断该状态是否合法,不合法return掉  //如果width+box[35][0]刚好==100,i+1==36,这个状态也是合法的
    {
        return;
    }
    if(width==100)//先判断是否满足目标状态(width==100),如果是的话,do something
    {
        if(count>sum)
        {
            sum=count;
        }
        return;//如果是目标状态,就return吧
    }


    if(box[i][1]<=20)//判断是否高度小于20
    {
        dfs(count+1,width+box[i][0],i+1);//进入新状态
        //如果width+box[35][0]刚好==100,i+1==36,这个状态也是合法的
}
dfs(count,width,i+1);//进入新状态

}

int main()
{

    dfs(0,0,0);//DFS的初始状态

    cout<<sum;
    return 0;
}
*/



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值