装箱问题 (贪心水题)

【题目描述】

    一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为1*1, 2*2, 3*3, 4*4, 5*5, 6*6。这些产品通常使用一个 6*6*h 的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。

【题目链接】

    http://noi.openjudge.cn/ch0406/19/

【算法】

    由于需要装箱的产品总面积一定,则最优情况是箱子浪费面积最少。6,5,4,3所需包裹数是一定的,然后尽可能满足2,最后在考虑1。细节要注意下,同时码力太弱了。。。唉。。。

【代码】

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int ans;
 4 int a[7],b[4]={0,5,3,1};
 5 int main()
 6 {
 7     while(scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6])!=EOF) {
 8         if(!a[1]&&!a[2]&&!a[3]&&!a[4]&&!a[5]&&!a[6]) break;
 9         ans=a[6]+a[5]+a[4]+ceil(a[3]/4.0);
10         int for2=a[4]*5+b[a[3]%4];
11         if(for2<a[2]) ans+=ceil((a[2]-for2)/9.0); //至此,2,3,4,5,6所需箱子数已经确定,故当前还能插入的1的个数可以考虑反面用总面积减去用于其它产品的面积
12         int for1=ans*36-36*a[6]-25*a[5]-16*a[4]-9*a[3]-4*a[2];
13         if(for1<a[1]) ans+=ceil((a[1]-for1)/36.0);
14         printf("%d
",ans);
15     }
16     return 0;
17 }
原文地址:https://www.cnblogs.com/Willendless/p/9351398.html