请问这题怎么做

装箱问题

约定:所有数据范围均在int类型内。

一个工厂制造的产品形状都是长方体,他们的高度都是h,长和宽都相等,一共有6个型号,他们的长宽尺寸表示分别为 11,22,33,44,55,66。这些产品通常要使用一个66h的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂想要减小每个订单运送时的包裹数量。需要你编写一个程序帮他们解决这个问题。

输入:包括几行,每一行代表一个订单。每个订单里包括6个整数,分别表示11到66这6种产品的数量。输入6个0表示结束。

输出:每行输出一个整数,对应订单所需的最小包裹数。

样例输入:

0 0 4 0 0 1

7 5 1 0 0 0

0 0 0 0 0 0

样例输出:

2

1
2 个赞

核心代码
(有用给个解决方案)

1 个赞
while(1){
        cnt=0;
        scanf("%d%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5,&a6);
 
        if(a1==0&&a2==0&&a3==0&&a4==0&&a5==0&&a6==0)
            break;
        cnt+=a6+a5+a4+(a3+3)/4;  //a6和a5和a4以及(a3+3)/4都分别占用一个箱子,(a3+3)/4是对a3每满4向上取整的个数
 
        x=5*a4+c[a3%4];   //这是计算2×2空位子的总个数,每一个a4装的箱子都有着5个2×2的空位子+每一个a3装的箱子可能存在2×2的空位子数量
        if(a2>x) {   //计算a2的数量是否大于其空位子的数量
            cnt += (a2 - x + 8) / 9;  //计算a2填满空位子后剩余的a2所需要的箱子的个数。(a2-x+8)/9是对a2每满9向上取整的箱子个数
        }
        y=36*cnt-36*a6-25*a5-16*a4-9*a3-4*a2;  //计算剩余1×1空位子的个数
        if(a1>y) {//计算a1的数量是否大于其空位子的数量
            cnt += (a1 - y + 35) / 36;//计算a1填满空位子后剩余的a1所需要的箱子的个数.(a1-y+35)/36是对a1每满36向上取整的箱子个数
        }
        printf("%d\n",cnt);
    }
1 个赞

运行结果

1 个赞

已经解决啦

#include<bits/stdc++.h>
using namespace std;
int n=6,ans,a[1010101],b[4]={0,5,3,1},temp;
int main()
{
	while(true)
	{
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
		} 
		if(a[1]==0 && a[2]==0 && a[3]==0 && a[4]==0 && a[5]==0 && a[6]==0)return 0;
		ans=a[6]+a[5]+a[4]+ceil(a[3]/4.0);
		temp=a[2];
		temp=temp-(a[4]*5+b[a[3]%4]);
		if(temp>0)ans+=ceil(temp/9.0);
		a[1]=a[1]-(ans*36-a[6]*36-a[5]*25-a[4]*16-a[3]*9-a[2]*4);
		if(a[1]>0)ans+=ceil(a[1]/36.0);
		cout<<ans<<endl;
	}
	return 0;
}

@栗子酱

1 个赞