给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;
}