题目
有一个盒子工厂生产不同大小的正方体盒子,尺寸分别是 11, 22, 33, 44, 55, 66,这些盒子都放到一个6*6大小的正方体包装盒里里来邮寄给客户,工厂希望能用尽可能少包装盒的来装客户需要的盒子以此来降低成本。现在需要你来写一个程序,计算对于某一个客户的订单最少需要几个包装盒。
输入
输入数据包含多行,每一行六个数代表一份订单,每个数直接用空格分开,依次表示从11尺寸到66尺寸的各个尺寸盒子的需求数量,输入末尾由6个0表示结束输入
- 样例:
0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0
输出
对于每一行输入数据(即每个订单)你都需要输出一行代表该订单最少需要的包装盒数量,对于6个0的输入程序不需要输出任何数据
- 样例:
2
1
题解:
首先理解题意:装的时候只考虑底面积6*6,高度相同
- 贪心方法:从大到小装,从大到小搭配
先装规格6 * 6、5 * 5、4 * 4的(一个6 * 6的包裹只能装其中一个)
每个5 * 5的可以搭配11个1 * 1的箱子
每个4 * 4的可以搭配5个2 * 2的箱子或20个1 * 1的箱子
每4个3 * 3的箱子正好共用一个包裹
对于多出来的(1,2,3)搭配2 * 2 和 1 * 1的箱子
同理多出来的 2 * 2 与 1 * 1的箱子
代码:
#include<stdio.h>
int main(){
int x1, x2, x3, x4, x5, x6;
int a[] = {0, 5, 3, 1};
while(scanf("%d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6)!=EOF){
if(x1 == 0 && x2 == 0 && x3 == 0 && x4 == 0 && x5 == 0 && x6 == 0){
return 0;
}
int sum = 0;
int temp5 = 0;
int temp4 = 0;
int temp3 = 0;
int temp2 = 0;
sum += x6; x6 -= x6;
sum += x5; temp5 = ( 6 * 6 - 5 * 5 ) * x5;//表示目前x5包裹中的剩余空间
x5 -= x5;
while(temp5 > 0 && x1 > 0){
temp5 --; x1 --;
}
sum += x4; temp4 = ( 6 * 6 - 4 * 4 ) * x4;//目前x4包裹中的剩余空间
x4 -= x4;
while(temp4 > 0 && x2 > 0){
temp4 -= 2*2; x2--;
}
while(temp4 > 0 && x1 > 0){
temp4--; x1--;
}
sum += x3/4; x3 %= 4;
if(x3 > 0){
sum++;
temp3 = 6 * 6 - 3 * 3 *x3;//目前x3包裹中的剩余空间
//装x2:
x2 -= a[x3];
temp3 -= a[x3] * 4;
//装x1:
while(temp3 > 0 && x1 > 0){
temp3 --; x1 --;
}
}
sum += x2/9; x2 %= 9;
if(x2 > 0){
sum++;
temp2 = 6 * 6 - x2 * 4;
while(temp2 > 0 && x1 > 0){
temp2 --; x1 --;
}
}
sum += x1/36; x1 %= 36;
if(x1 > 0){
sum++;
}
printf("%d\n", sum);
}
}
待优化:
-可将每次分支多出来的空间汇总,最后与x2、x1 大小作比较统一计算sum的数量。