编程新手入门到入土(1)——装箱问题

1 阅读4分钟

目录:

  1. 问题引入;
  2. 问题介绍和思路;
  3. 解决方案;

问题引入

题目描述

一个工厂制造的产品形状都是长方体,他们的高度都是h,长和宽都相等,一共有6个型号,他们的长宽分别为1X1,2X2,3X3,4X4,5X5,6X6。这些产品通常需要一个6X6Xh的长方体包裹包装,然后邮寄给客户。因为邮费很贵,所以工厂要想方设法地减少每个订单运送时的包裹数量。他们很需要有一个好的程序以解决这个问题从而节省费用。现在这个程序由你来设计。

输入

每个订单信息用包括6个整数的一行数据表示,中间用空格隔开,分别为1X1至6X6这6种产品的数量。

输出

输出一个整数代表对应的订单所需的最小包裹数。

样例输入

9 5 3 2 4 6

样例输出

13

问题介绍

如题目所述,我们需要求得订单所需的最小包裹数,就说明需要尽量地利用每一个包裹中的空间。

接下来我们分别讨论不同情况下可以计算的最优方案。

因为2X2和1X1的产品比较小,可以考虑用来补其他包裹剩下的空隙。

先考虑用2X2来补空,最后用1X1来补剩下杂乱的空位。

放入6X6产品时

这时包裹被装满,不能再放入别的包裹。

放入5X5产品时

这时包裹有剩余空间,但只能放入1X1的包裹。

放入4X4产品时

这时的包裹剩余空间较大,最多可以放入5个2X2包裹。

放入3X3产品时

放入3X3产品的情况比较特殊,因为包裹中可以放下不同数量的3X3产品,所导致剩余的空间中放入的2X2产品数量会不一样。

放入4个3X3产品时

这时包裹被装满,不能放入其他产品。

放入3个3X3产品时

这时剩余的空间最多能放入1个2X2产品。

放入2个3X3产品时

这时剩余的空间最多能放入3个2X2产品。

放入1个3X3产品时

这时剩余的空间最多能放入5个2X2产品。

至此,复杂的情况已经分析完毕,接下来可以进行代码的书写。

解决方案

#include<stdio.h>
#include<math.h>

int main()
{
    return 0;
}
  1. 设置数组来储存6种不同产品的数量,为了方便,可以直接舍弃product[0]。

同时,根据上文中我们讨论的不同数量3X3产品时2X2产品最多能放入的量也创立数组,同样舍弃s3_l2[0]。

读入6种产品的数量。定义总需要的包裹数为bgs。

int product[7]={0};
int s3_l2[4]={0,5,3,1};
scanf("%d %d %d %d %d %d",&product[1],&product[2],&product[3],&product[4],&product[5],&product[6]);
int bgs=0;
  1. 先计算6X6到3X3产品需要的包裹数。

由于在3X3产品数不是4的倍数时,需要额外再加一个包裹,此处采用ceil函数。

同时,判断剩余用来可存放2X2的空间是否足够2X2产品的数量,如果不够就继续加。

bgs=product[6]+product[5]+product[4]+ceil(product[3]*1.0/4);
int kwei_2=product[4]*5+s3_l2[product[3]%4];
if(product[2]>kwei_2){
    bgs+=ceil((product[2]-kwei_2)*1.0/9);
}
  1. 然后计算剩余可以用来存放1X1产品的空间,与实际数量进行比较,不够就继续加。

我们在这里计算采用总的空间-已经用去的空间。

int kwei_1=bgs*36-product[6]*36-product[5]*25-product[4]*16-product[3]*9-product[2]*4;
if(product[1]>kwei_1){
    bgs+=ceil((product[1]-kwei_1)*1.0/36);
}
  1. 最后输出结果bgs。
printf("%d\n", bgs);

到这里,本道题已经解决完毕,下面是本题的完整代码。

#include<stdio.h>
#include<math.h>

int main()
{
	int product[7] = { 0 };
	int s3_l2[4] = { 0,1,3,5 };
	int bgs;
	scanf("%d %d %d %d %d %d",&product[1],&product[2],&product[3],&product[4],&product[5],&product[6]);
	bgs = product[6] + product[5] + product[4] + ceil(product[3] * 1.0 / 4);
	int kwei_2 = product[4] * 5 + s3_l2[product[3] % 4];
	if (product[2] > kwei_2) {
		bgs = bgs + ceil((product[2] - kwei_2) * 1.0 / 9);
	}
	int kwei_1 = bgs * 36 - product[6] * 36 - product[5] * 25 - product[4] * 16 - product[3] * 9 - product[2] * 4;
	if (kwei_1 < product[1]) {
		bgs = bgs + ceil((product[1] - kwei_1) *1.0 / 36);
	}
	printf("%d\n", bgs);
    return 0;
}
	
	

到了这里,很感谢大家可以看完,如果有什么不足可以提出,我会努力改进的。