标题:打包问题!!纠结!
只看楼主
等你的解答
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2012-3-19
结帖率:83.33%
已结贴  问题点数:12 回复次数:10 
打包问题!!纠结!
某个工厂生产出的产品都要被打包放入正四棱柱的盒子内。所有盒子
的高度都为h,但底面的尺寸不同,可以为1*1,2*2,3*3,4*4,5*5,
或6*6。
这些盒子将被放入高度为h,底面尺寸为6*6的箱子里,送到消费者手
中。为了降低运送成本,工厂希望尽量减少箱子 数量。如果有一个
好的算法,能使箱子的数量降到最低,这将给工厂节约不少资金。请
你写一个这样的程序。
【输入】
输入文件:bag.in
仅一行六个非负整数a1,a2,a3,a4,a5,a6 它们分别为底面尺寸为
1*1,2*2,3*3,4*4,5*5,6*6的盒子的个数。(0≤ai≤100)
【输出】
输出文件:bag.out
仅一个数,即箱子的最少个数。
【输入样例】
0 0 4 0 0 1
【输出样例】
2


求算法
搜索更多相关主题的帖子: 盒子 消费者 
2012-04-14 20:16
S_Ringo
Rank: 4
来 自:歌舞伎町
等 级:业余侠客
帖 子:94
专家分:230
注 册:2012-4-15
得分:12 
作为一个非计算机专业的上班族兼C业余爱好者,哥煞费苦心的写了这个恶心的程序,貌似运行还是可以得到正确结果滴,求鉴定……
//某个工厂生产出的产品都要被打包放入正四棱柱的盒子内。所有盒子的高
//度都为h,但底面的尺寸不同,可以为1*1,2*2,3*3,4*4,5*5,或6*6。
//这些盒子将被放入高度为h,底面尺寸为6*6的箱子里,送到消费者手中。
//为了降低运送成本,工厂希望尽量减少箱子 数量。如果有一个好的算法,
//能使箱子的数量降到最低,这将给工厂节约不少资金。请你写一个这样的程序。
#include<stdio.h>
int main()
{
    int box[6];
    int i=0;                                       //定义数组用于存放箱子个数;
    int m_r=0;
    int result=0;                                  //变量m_r用于存放中间结果,result用于存放最后结果;
    printf("分别输入每个箱子的个数:\n");          //输入箱子个数;
    for(;i<6;i++)
    {
        scanf("%d",&box[i]);
    }
                                                   
    m_r=box[5]+box[4]+box[3]+box[2]/4;             //6*6、5*5、4*4每个分别要占用一个箱子,3*3每4个占用一个箱子;
    box[0]=box[0]-box[4]*11;                       //按最优方案,每个5*5的箱子可以附带11个1*1的箱子;
    box[1]=box[1]-box[3]*5;                        //每个4*4的箱子可以附带5个2*2的箱子;
    box[2]=box[2]%4;
                                                   //初步装箱结束,剩下的是最优方案之外的再次组合;
   
                                                   //先考虑此时已经没有剩下箱子的情况,此时m_r就是最终结果;
    if((box[0]<=0)&&(box[1]<=0)&&(box[2]<=0))
    {
        result=m_r;
    }
                                                   //再考虑只剩下3*3的箱子的情况;
    else if((box[0]<=0)&&(box[1]<=0)&&(box[2]>0))
    {
        result=m_r+1;
    }
                                                   //只剩下3*3和2*2的箱子的情况;
    else if((box[0]<=0)&&(box[1]>0)&&(box[2]>0))
    {
        if(box[2]==1)                              //3*3剩下一个;
        {
            if(box[1]<=4)                          //每个3*3的箱子可以附带4个2*2的箱子
            {
               result=m_r+1;
            }
            else
            {
               box[1]=box[1]-4;
               result=m_r+1+box[1]/9+1;            //2*2的箱子每9个可以装满一个大箱子;
            }
        }
        if(box[2]==2)                              //3*3剩下两个;
        {
            if(box[1]<=3)                          //每两个3*3的箱子可以附带3个2*2的箱子;
            {
                result=m_r+1;
            }
            else
            {
                box[1]=box[1]-3;
                result=m_r+1+box[1]/9+1;
            }
        }
        if(box[2]==3)                              //3*3剩下三个;
        {
            if(box[1]<=1)                          //每三个3*3的箱子可以附带一个2*2的箱子;
            {
                result=m_r+1;
            }
            else
            {
                box[1]--;
                result=m_r+1+box[1]/9+1;
            }
        }
    }
                                                  //只剩下3*3和1*1的箱子的情况;
    else if((box[0]>0)&&(box[1]<=0)&&(box[2]>0))
    {
        if(box[2]==1)
        {
            if(box[0]<=27)                        //每个3*3的箱子可以附带27个1*1的箱子;
            {
                result=m_r+1;
            }
            else
            {
                box[0]=box[0]-27;
                result=m_r+1+box[0]/36+1;         //每36个1*1的箱子可以装满一个大箱子;
            }
        }
        if(box[2]==2)
        {
            if(box[0]<=18)                        //每两个3*3的箱子可以附带18个1*1的箱子;
            {
                result=m_r+1;
            }
            else
            {
                box[0]=box[0]-18;
                result=m_r+1+box[0]/36+1;
            }
        }
        if(box[2]==3)
        {
            if(box[0]<=9)
            {
                result=m_r+1;
            }
            else
            {
                box[0]=box[0]-9;
                result=m_r+1+box[0]/36+1;
            }
        }
    }
                                                  //上述步骤虽然代码繁琐,但是其实很容易想,也容易写出来;
                                                  //******************************************************
                                                  //再考虑1*1、2*2、3*3都有剩余的情况,也是最复杂的情况……
    else if((box[0]>0)&&(box[1]>0)&&(box[2]>0))   //不过,依然还是优先尽可能地装2*2的箱子;
    {
        if(box[2]==1)                             //依然先考虑3*3只有一个的情况;
        {
            if(box[1]<=4)
            {
                box[0]=box[0]-(36-9-4*box[1]);
                m_r++;
                (box[0]>0)?box[0]:0;
                result=m_r+box[0]/36+1;
            }
            else
            {
                box[1]=box[1]-4;
                m_r++;
                box[0]=box[0]-(36-4*(box[1]%9));
                (box[0]>0)?box[0]:0;
                result=m_r+box[1]/9+box[0]/36+1;
            }
        }
        if(box[2]==2)
        {
            if(box[1]<=3)
            {
                box[0]=box[0]-(36-18-4*box[1]);
                m_r++;
                (box[0]>0)?box[0]:0;
                result=m_r+box[0]/36+1;
            }
            else
            {
                box[1]=box[1]-3;
                m_r++;
                box[0]=box[0]-(36-4*(box[1]%9));
                (box[0]>0)?box[0]:0;
                result=m_r+box[1]/9+box[0]/36+1;
            }
        }
        if(box[2]==3)
        {
            box[1]--;
            m_r++;
            box[0]=box[0]-5;
            box[0]=box[0]-(36-4*(box[1]%9));
            (box[0]>0)?box[0]:0;
            result=m_r+box[1]/9+box[0]/36+1;
        }
    }
    else                                            //只有1*1和2*2的情况,直接按面积计算即可;
    {
        box[0]=box[0]-(36-4*(box[1]%9));
        (box[0]>0)?box[0]:0;
        result=m_r+box[1]/9+box[0]/36+1;
    }
    printf("the result is %d\n",result);
    return(0);
}
中间逗号表达式是为了避免出现负数而特地加上去的……
2012-04-16 22:08
S_Ringo
Rank: 4
来 自:歌舞伎町
等 级:业余侠客
帖 子:94
专家分:230
注 册:2012-4-15
得分:0 
除了题目给的例子测试成功之外,还测试了以下两组数据:
(调试工具为Visual C++6.0)
1、输入100 80 30 10 2 1,结果为26个;
2、输入10 10 10 10 10 10,结果为33个;
经验算,确实是最少的箱子数……

看我写的这么辛苦,给点分呗?
收到的鲜花
  • TonyDeng2012-04-16 22:42 送鲜花  20朵   附言:给你辛苦分!
  • a95806432012-04-17 21:43 送鲜花  5朵   附言:好文章
2012-04-16 22:34
等你的解答
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2012-3-19
得分:0 
好强啊。。。哥哥...太佩服了.....全部给你....虽然我也不知道你写的对不对...就冲你这精神.不离不弃的精神....全部给你了
2012-04-18 22:31
S_Ringo
Rank: 4
来 自:歌舞伎町
等 级:业余侠客
帖 子:94
专家分:230
注 册:2012-4-15
得分:0 
额,过奖,说不离不弃太夸张了,主要是我还是想出了自己的算法,所以努力实现而已,要是我想不出来算法,我也放弃了,哈哈……
其实,正确与否,你也可以自己验算的,如果发现哪里错了,记得告诉我咯……
2012-04-18 22:39
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
给你顶一下,想要点颜色么?

授人以渔,不授人以鱼。
2012-04-19 13:58
S_Ringo
Rank: 4
来 自:歌舞伎町
等 级:业余侠客
帖 子:94
专家分:230
注 册:2012-4-15
得分:0 
回复 6楼 TonyDeng
额,呵呵,颜色是指红色么?不过我暂时还没达到那个水平啊,哈哈……
反正现在自己工作也算稳定,待遇也不差,至于C,纯属业余爱好吧,没事研究一下,预防老年痴呆吧……
好意心领了!
收到的鲜花
  • TonyDeng2012-04-19 14:56 送鲜花  20朵   附言:你的钻研比较细致,很好的。
2012-04-19 14:36
ljk694145447
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:44
专家分:114
注 册:2011-11-29
得分:0 
S_Ringo 说得很详细,但是没必要写这么多程序吧。
2012-04-20 16:16
Alar30
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:10
帖 子:988
专家分:1627
注 册:2009-9-8
得分:0 
顶2#的兄弟
2012-04-20 17:06
ljk694145447
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:44
专家分:114
注 册:2011-11-29
得分:0 
程序代码:
/*************************************************************************
某个工厂生产出的产品都要被打包放入正四棱柱的盒子内。所有盒子的高
  度都为h,但底面的尺寸不同,可以为1*1,2*2,3*3,4*4,5*5,或6*6。
  这些盒子将被放入高度为h,底面尺寸为6*6的箱子里,送到消费者手中。
  为了降低运送成本,工厂希望尽量减少箱子 数量。如果有一个好的算法,
  能使箱子的数量降到最低,这将给工厂节约不少资金。请你写一个这样的程序。
*************************************************************************/
#include<stdio.h>

int main( void )
{
    int box[6];
    int Box_num;
    printf("请输入底面积为:1*1、2*2、3*3、4*4、5*5、6*6的各类型箱子个数:");
    for(int i=0;i<6;i++)
    {
        scanf("%d",&box[i]);
    }

    Box_num=box[5]+box[4]+box[3]+box[2]/4;

    box[2]=box[2]%4;
    box[1]=box[1]-5*box[3];
    box[0]=box[0]-11*box[4];
    if(box[2]>0)
    {
        Box_num=Box_num+1;
        box[1]=box[1]-(7-2*box[2]);
        box[0]=box[0]-(8-box[2]);
    }
    if(box[1]>0)
    {
        Box_num=Box_num+box[1]/9;
        box[1]=box[1]%9;
        if(box[1]>0)
        {
            Box_num=Box_num+1;
        }
    }
    if(box[0]>0)
    {
        box[0]=box[0]+4*box[1];
        if(box[0]>0)
        {
            Box_num=Box_num+box[0]/36;
            box[0]=box[0]%36;
        }
    }
    if(box[0]>0)
    {
        Box_num=Box_num+1;
    }

    printf("所需要的最少的箱子个数为%d\n",Box_num);

    return 0; 
}
2012-04-20 22:10



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-365801-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.511455 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved