poj 1017 packets (贪心)

装箱问题  

    问题描述
    一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个
型号,他们的长宽分别为 1*1, 2*2, 3*3, 4*4, 5*5, 6*6.  这些产品通常使用一个  6*6*h       

的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的
包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由
你来设计。 
    输入数据 
    输入文件包括几行,每一行代表一个订单。每个订单里的一行包括六个整数,中间用空
格隔开,分别为 1*1 至6*6 这六种产品的数量。输入文件将以 6 个0 组成的一行结尾。 
    输出要求 
    除了输入的最后一行6 个0 以外,输入文件里每一行对应着输出文件的一行,每一行输
出一个整数代表对应的订单所需的最小包裹数。 
    输入样例
    0 0 4 0 0 1  
    7 5 1 0 0 0  
    0 0 0 0 0 0  
     
    输出样例 
    2  
    1  

确定好贪心策略,模拟就好了,网上的思路

#include<iostream>
using namespace std;
int num_2[] = {0,5,3,1};
int num_1[] = {0,7,6,5};
int main()
{
	int a[7],ans,flag;
	while(1)
	{
		flag=1;
		ans=0;
		for(int i=1;i<=6;i++)
		{
			cin>>a[i];
			if(a[i]!=0)flag=0;
		}
		if(flag)break;
		ans=a[6]+a[5]+a[4]+(a[3]+3)/4;//4 5 6 尺寸的每个都要新开箱子
		/*将新开的箱子尽量填满*/ 
		int a2 = a[4]*5 + num_2[a[3]%4];//尽量填满3 4 所需要2箱子的个数
		int a1 = a[5]*11 + num_1[a[3]%4];//填完2填1 
		if(a[2]>a2)//有剩余新开箱子
		{ 
			ans+=(a[2]-a2+8)/9;//9 个2*2箱子可以填满一个6*6箱子,不足9个算一个
			a1+= 36-((a[2]-a2)%9)*4;//将新开的箱子用1*1填
		} 
		else  //没有或者不够:2 不用新开箱子,不够的用1来填 
		{
			 a1+=(a2-a[2])*4;
		} 
		if(a[1]>a1)
		ans+=(a[1]-a1+35)/36;//除以36 向上取整,不足36个也新开一个 
		cout<<ans<<endl;
	}
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值