菜,上一年的题目,今天又看了遍还是没想到什么好的方法,只能列举出各种情况,先枚举大的然后根据箱子的占位情况接下来只能装A*A大小的箱子,
如先装6x6只能单独一箱;
先装5x5,剩下空间只能装1x1;
先装4x4,然后顺序枚举装2x2 和剩下空间装1x1;
先装3x3,判断3x3根据已给数量最多装多少个,因为最多4个,当装了1个3x3,画图分析最多只能装5个2x2,剩下空间装1x1,当装2个3x3,分析最多只能装3个2x2,剩下空间装1x1,当装3个3x3,分析最多只能装1个2x2,剩下空间装1x1;
先装2x2,根据已给数量最多装多少2x2个,剩下空间装1x1
先装1x1就不用说了吧。
每轮++cnt
程序写的不好,给大家个数据网址希望大家的程序能调试成功
http://www.cnblogs.com/ZiningTang/p/3837073.html
#include <cstdio>
using namespace std;
int a[7];
int main()
{
int num;
while(scanf("%d %d %d %d %d %d", &a[1], &a[2], &a[3], &a[4], &a[5], &a[6])){
int sum = 0;
for(int i = 1; i <= 6; ++i){
sum += a[i];
}
if(sum == 0){
break;
}
int cnt = 0;
for(int i = 6; i >= 1; --i){
while(a[i]){
int tmp = 36, c;
if(i == 6 || i == 5 || i == 4){
c = 1;
}
else if(i == 3){
c = 4;
}
else if(i == 2){
c = 9;
}
else if(i == 1){
c = 36;
}
if(c <= a[i]){
a[i] -= c;
}
else{
c = a[i];
a[i] = 0;
}
tmp -= i * i * c;
if(i == 5){
if(tmp >= a[1]){
a[1] = 0;
}
else{
a[1] -= tmp;
}
}
else if(i == 4){
for(int j = 2; j >= 1; --j){
c = tmp / (j * j);
if(c >= a[j]){
tmp -= j * j * a[j];
a[j] = 0;
}
else{
a[j] -= c;
tmp -= c * j * j;
}
}
}
else if(i == 3){
if(c == 1){
c = 5;
}
else if(c == 2){
c = 3;
}
else if(c == 3){
c = 1;
}
else{
c = 0;
}
if(c >= a[2]){
tmp -= 4 * a[2];
a[2] = 0;
}
else{
a[2] -= c;
tmp -= c * 4;
}
c = tmp;
if(c >= a[1]){
a[1] = 0;
}
else{
a[1] -= c;
}
}
else if(i == 2){
c = tmp;
if(c >= a[1]){
a[1] = 0;
}
else{
a[1] -= c;
}
}
++cnt;
}
}
printf("%d\n", cnt);
}
return 0;
}