這題是道貪心題,可以一步一步模擬的,不過需要點耐心和細心。
(思路就不寫了,看到別人的寫的挺好的,想了解的請參考:優YoU http://blog.csdn.net/lyy289065406/article/details/6674366
)
題目鏈接:http://poj.org/problem?id=1017
以下是我寫的代碼:
#include<stdio.h>
int main()
{
int s,a[7],m=0,i;
for (i=1;i<=6;i++)
{
scanf("%d",&a[i]);
m+=a[i];
}
while (m>0)
{
s=a[6]+a[5]+a[4];
a[1]=a[1]-a[5]*11;
a[2]=a[2]-a[4]*5;
if (a[2]<=0) a[1]=a[1]+a[2]*4;
s=s+a[3]/4;
a[3]%=4;
if (a[3]>0)
{ s++;
if (a[2]>0)
{
if (a[3]==1)
{
if (a[2]>5)
{
a[2]-=5;
a[1]-=7;
}
else
{
a[1]=a[1]-(27-a[2]*4);a[2]=0;
}
}
else if (a[3]==2)
{
if (a[2]>3)
{
a[2]-=3;
a[1]-=6;
}
else
{
a[1]=a[1]-(18-a[2]*4); a[2]=0;
}
}
else if (a[3]==3)
{
if (a[2]>1)
{
a[2]-=1;
a[1]-=5;
}
else
{
a[1]=a[1]-(9-a[2]*4);a[2]=0;
}
}
}
else a[1]=a[1]-(36-a[3]*9);
}
if (a[2]>0)
{
s+=a[2]/9;
a[2]%=9;
if (a[2]>0) s++;
a[1]=a[1]-(36-a[2]*4);
}
if (a[1]>0)
{
s+=a[1]/36;
if (a[1]%36>0) s++;
}
printf("%d\n",s);
m=0;
for (i=1;i<=6;i++)
{
scanf("%d",&a[i]);
m+=a[i];
}
}
return 0;
}
感覺自己寫的不太好,於是做完後,看了下別人的題解,看到某博客上的方法挺好的。
以下代碼參考 萬里晴空 - 博客頻道 - CSDN.NET
#include <stdio.h>
int main()
{
int N, a, b, c, d, e, f, y, x;
int u[4]={0, 5, 3, 1};
while(1)
{
scanf("%d%d%d%d%d%d", &a, &b, &c, &d, &e, &f);
if (a+b+c+d+e+f==0) break;
N = f + e + d + (c + 3) / 4; //先將6*6,5*5,4*4,3*3的包好
y = 5 * d + u[c % 4]; //y表示已經使用的N個箱子至多可容納多少個2*2的包裹
if(b > y) N += (b - y + 8 ) / 9; //如果那N個箱子裝不完2*2的包裹,再另外使用新的箱子
x = 36 * N - 36 * f - 25 * e - 16 * d - 9 * c - 4 * b; //表示當前已經使用的N個箱子至多可容納多少個1*1的包裹
if(a > x) N += ( a - x + 35 ) / 36; //裝不完再用新的箱子
printf("%d\n", N);
}
return 0;
}
這種方法的思路,剛好與前面的相反,前者是一步一步地爲6*6,5*5,4*4,3*3開闢新箱將2*2,1*1的包填充空位,
後者是先給不能用於填充的開闢空箱6*6,5*5,4*5,3*3,
然後,看看已開闢的箱能夠容納多少用於填充的包裹,判斷是否需要開闢新箱。