POJ 1017 Packets

本文探讨了一种特定的物品装箱问题,即如何将不同大小的物品最优化地装入固定大小的容器中。通过逐步解析算法流程,介绍了如何使用贪心策略来解决这一问题,并提供了详细的程序实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给1*1到6*6的包各若干个,问需要多少个6*6的包才能放的下..

没有多想,直接就开始写了,虽然写的有点繁琐,但思路清晰,很快就写完了..

贪心的思想,尽量先放大的..程序注释比较详细,直接看程序吧,

#include <cstdio>
using namespace std;
int main(){
	int a[7];
	while(scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6])){
		if(a[1]+a[2]+a[3]+a[4]+a[5]+a[6]==0)break;
		int res=0;
		while(a[6]-->0)res++;//6只能放一个 
		while(a[5]-->0){//放一个5,剩下放1 
			res++;
			a[1]-=11;
		}
		while(a[4]-->0){//4占1个,剩下放1和2 
			res++;
			if(a[2]>0){//还剩下2 
				a[2]-=5;
				if(a[2]<0){//a没有放满 
					a[1]+=a[2]*4;//没有放满2的地方放1,注意现在a[2]是负数 
				}
			}else{
				a[1]-=20;//没2,只能放1了 
			}	 
		}
		int rem3=a[3]%4;//一个包放4个3,多出来的3
		res+=a[3]/4;
		//剩下不同个数的3分情况讨论 
		if(rem3==1){
			res++;
			if(a[2]>0){//剩下的空间可以放5个2,7个1 
				a[2]-=5;
				a[1]-=7;
				if(a[2]<0){//没2了,放1 
					a[1]+=a[2]*4;
				}	
			}else{
				a[1]-=27;//全部放1 
			} 
		}else if(rem3==2){
			res++;
			if(a[2]>0){//剩下的空间可以放3个2,6个1 
				a[2]-=3;
				a[1]-=6;
				if(a[2]<0){//没2了,放1 
					a[1]+=a[2]*4;
				}
			}else{
				a[1]-=18;//全部放一 
			}
		}else if(rem3==3){
			res++;
			if(a[2]>0){//剩下的空间可以放1个2,5个1 
				a[2]-=1;
				a[1]-=5;
			}else{
				a[1]-=9;//全部放9; 
			}
		}
		if(a[2]>0){//还剩2 
			res+=a[2]/9;
			if(a[2]%9!=0){
				res++;
				a[1]-=36-(a[2]%9)*4; 
			} 
		}
		if(a[1]>0){//还剩1 
			res+=a[1]/36;
			if(a[1]%36!=0)res++; 
		}
		printf("%d\n",res); 
	
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值