用貪心算法,先從大的開始裝~~測試數據參考: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;
}