大意是说:将1*1,2*2,3*3,4*4,5*5,6*6的盒子放入6*6的盒子中,最少需要多少盒子?
典型的贪心算法,先放6*6,5*5,4*4的,5*5剩下的只能放1*1的,而4*4放剩下的先放2*2,不够再放1*1的。。具体看代码:
#include<iostream>
using namespace std;
int main(){
int n1,n2,n3,n4,n5,n6;
int sum;
while(cin>>n1>>n2>>n3>>n4>>n5>>n6){
if(n1==0 && n2==0 && n3==0 && n4==0 && n5==0 && n6==0)
break;
sum =0;
sum += n6+n5+n4;
//计算5*5剩余的格子
if(n5 > 0)
n1 -= 11*n5;
//计算4*4剩余的格子
if(n4 >0 ){
if(n2 >0)
n2 -= 5*n4;
//如果2*2的格子不够填满剩余的格子则用1填
if(n1 >0 && n2 <0)
n1 -= (-n2)*4;
}
//计算3*3的格子
if(n3 >0){
sum += n3/4;
n3 = n3%4;
if(n3 > 0){
//有多余的3*3先用2*2来填
sum++;
if(n2 >0){
n2 -= 1+(3-n3)*2;
//如果2*2的没填够
if(n2 <=0)
n1 -= (-n2)*4+7;
else
n1 -= 7;
}
//如果没有2*2的了,直接用1*1填
else if(n1 >0){
n1 -= 9*(4-n3);
}
}
}
if(n2 > 0){
sum += n2/9;
n2 = n2%9;
if(n2 >0)
sum++;
}
if(n1 > 0){
if(n2 >0){
n1 -= (36-n2*4);
if(n1 >0){
sum += n1/36;
if(n1 % 36 != 0)
sum++;
}
}
else{
sum += n1/36;
if(n1 % 36 != 0)
sum++;
}
}
cout<<sum<<endl;
}
return 0;
}
这是很常见的解法了,但在别人博客中看到非常简单的解法,能达到0ms。。目前我的代码水平还没达到,待续。。