用贪心算法,先从大的开始装~~测试数据参考:http://blog.sina.com.cn/s/blog_7b7c7c5f0100srtp.html
/*Problem: 1017
Memory: 156K Time: 16MS
Language: C++ Result: Accepted */
#include<stdio.h>
#include<string.h>
#include<algorithm>
int main()
{
int num[6];//保存输入
int rest_5_1, rest_4_2, rest_3_1, rest_3_2, rest_2_1, rest1;
int count;
while(1)
{
scanf("%d %d %d %d %d %d", &num[0], &num[1], &num[2], &num[3], &num[4], &num[5]);
if((num[0]+num[1]+num[2]+num[3]+num[4]+num[5]) == 0)
break;
rest_5_1 = 0;
rest_4_2 = 0;
rest_3_1 = 0;
rest_3_2 = 0;
rest_2_1 = 0;
rest1 = 0;
count = num[5];//size为6的产品独占一个箱子
if(num[4] != 0)//处理size为5的,放了一个size为5的之后就只能放size为1的了(最多能放11个size为1的)
{
count += num[4];
rest_5_1 = num[4]*11;
}
if(num[3] != 0)//处理size为4的
{
count += num[3];
rest_4_2 = num[3]*5;
}
if(num[2] != 0)//处理size为3的,有一个size为3的就要加一个箱子,大于4个小于等于8个就要加两个
{
if(num[2]%4 != 0)
{
count += num[2]/4+1;
if(num[2]%4 == 1)
{
rest_3_2 = 5;
rest_3_1 = 7;
}
if(num[2]%4 == 2)
{
rest_3_2 = 3;
rest_3_1 = 6;
}
if(num[2]%4 == 3)
{
rest_3_2 = 1;
rest_3_1 = 5;
}
}
else
{
count += num[2]/4;
rest_3_2 = 0;
rest_3_1 =0;
}
}
if(num[1] > (rest_4_2+rest_3_2))//需要新的空箱子
{
if((num[1]-(rest_4_2+rest_3_2))%9 !=0)//每一个空箱子可以装9个size为2的产品
{
count += (num[1]-(rest_4_2+rest_3_2))/9+1;
rest_2_1 = 36 - ((num[1]-(rest_4_2+rest_3_2))%9)*4;
}
else
{
count += (num[1]-(rest_4_2+rest_3_2))/9;
rest_2_1 = 0;
}
}
else//不需要新的空箱子
{
rest_2_1 = (rest_4_2+rest_3_2-num[1])*4;//装完2之后还剩下的可以装2的空降转为装1的空间
}
rest1 = rest_5_1+rest_3_1+rest_2_1;
if(num[0] > rest1)
{
if((num[0]-rest1)%36 != 0)
count += (num[0]-rest1)/36+1;
else
count += (num[0]-rest1)/36;
}
printf("%d\n", count);
}
return 0;
}