贪心算法——装箱问题

 

Central Europe 1996

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

Input
输入文件包括几行,每一行代表一个订单。每个订单里的一行包括六个整数,中间用空格隔开,分别为1*1至6*6这六种产品的数量。输入文件将以6个0组成的一行结尾。
Output
除了输入的最后一行6个0以外,输入文件里每一行对应着输出文件的一行,每一行输出一个整数代表对应的订单所需的最小包裹数。

 

Sample Input

0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0

 

Sample Output

 

 

2

1

思路:
1.求6*6的产品所需要的箱子数;
2.求5*5+1*1所需要的箱子数;
3.求(4*4+2*2)+(4*4+1*1+1*1)所需要的箱子数;
4.求(3*3+3*3)+(3*3+2*2+1*1)+(3*3+1*1+1*1+1*1)所以需要的箱子数;
(以上四步所需要的箱子数较好求,可做合并)
5.求剩余产品所需要的箱子数,先装大的再装小的。

 

代码实现:
#include <bits/stdc++.h>
using namespace std;
int a[7],u[5]={0,5,3,1};//u[i]记录装入i个3*3的产品后可装入的2*2的产品的数量,通过画图找规律可得int main()
{    
    while(cin>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6])
    {        
        int sum=0;        
        if(a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0&&a[5]==0&&a[6]==0)
            break;
        else
        {
            sum+=a[6]+a[5]+a[4]+ceil(a[3]/4.0);//完成前四步计算            
            int n2=5*a[4]+u[a[3]%4];//计算装4*4和3*3的箱子中剩下体积为2*2空间的数量
            if(a[2]>n2)sum+=ceil((a[2]-n2)/9.0);//2*2需要单独放的箱子数量            
            int n1=36*(sum-a[6])-a[5]*25-a[4]*16-a[3]*9-a[2]*4;//计算前面箱子所剩1*1面积
            if(a[1]>n1)sum+=ceil((a[1]-n1)/36.0);//1*1需要单独放的箱子数量       
            cout<<sum<<endl; 
        }    
    }    
    return 0;
}

 

 

 



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
贪心算法是一种常用的解决问题的方法,可以用来解决一些优化问题,如装箱问题。在装箱问题中,我们需要将一组物品放入尽可能少的箱子中。 下面是一个简单的贪心算法解决装箱问题的示例: 1. 将物品按照体积从大到小进行排序。 2. 创建一个空的箱子列表,用于存放装箱后的结果。 3. 遍历每个物品: - 尝试将物品放入已有的箱子中,如果能放下,则放入最先能放下该物品的箱子中。 - 如果无法放入任何已有的箱子中,则创建一个新的箱子,并将该物品放入其中。 4. 输出箱子列表作为结果。 以下是一个简单的 MATLAB 代码示例: ```matlab function boxList = packing(items, boxSize) % 对物品按照体积从大到小进行排序 sortedItems = sort(items, 'descend'); % 创建一个空的箱子列表 boxList = {}; % 遍历每个物品 for i = 1:length(sortedItems) item = sortedItems(i); fitInExistingBox = false; % 尝试将物品放入已有的箱子中 for j = 1:length(boxList) box = boxList{j}; if item <= boxSize - sum(box) % 物品能放入该箱子中 box = [box, item]; boxList{j} = box; fitInExistingBox = true; break; end end % 如果无法放入任何已有的箱子中,则创建一个新的箱子 if ~fitInExistingBox boxList{end+1} = [item]; end end end ``` 你可以调用 `packing` 函数,并传入物品列表和箱子的容量来求解装箱问题。返回的结果是一个箱子列表,每个箱子中包含一组物品。 请注意,贪心算法并不一定能够得到最优解,但在某些情况下可以提供较好的近似解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值