小y 有一个宽度为 100cm,高度为 20cm,深度为 1cm 的柜子,如下图。
小y 还有 363636 个礼物盒,他们的深度都为 1cm。
他们对应的宽度和高度如下,单位(cm)。
111 328 12311 17416 1351 1462 876 10810 18917 111010 15116 14125 6132 191419 10154 9167 9175 14185 201915 19203 172115 11227 252311 20249 122517 4269 19274 182810 102912 193017 33119 93220 163311 163410 23520 15363 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;
}
*/