poj1017装箱问题

来源:互联网 发布:深入浅出软件开发 pdf 编辑:程序博客网 时间:2024/06/05 11:07

用的纯模拟;;

听说有数学解法,稍候google一下:

#include <iostream>using namespace std; /*装有3*3 的箱子可放2*2的包数 当放1个3*3可以放5个2*2 2个可放3个2*2*/int cc[4] = {0, 5, 3, 1};int a, b, c, d, e, f;int num; int main(){    while (scanf("%d%d%d%d%d%d", &a, &b, &c, &d, &e, &f))    {        if (a==0 && b==0 && c==0 && d==0 && e==0 && f==0) break;         /* 4*4,5*5,6*6 的无疑每个都需要一个盒子 */        num = d + e + f + (c+3)/4;/* (c+3)/4 是对于 3*3 的包需要的 6*6 大小的盒子数 */        int aa, bb;        bb = 5*d + cc[c%4];        /* bb 是已有的包里能放多少个2*2的,每个放 4*4 的盒子还可以放 5 个 2*2的 */        if (b > bb) /* 如果可装2*2的个数小于2*2的总个数新开箱子 每1~9 个开一个新箱子  */            num += (b-bb+8)/9;        aa = num*36 - f*36 - e*25 - d*16 - c*9 - b*4;/* 总共剩下可以装1*1箱子的个数 */        if (a>aa) /* 如果可装1*1的个数小于1*1的总个数新开箱子 每1~36开一个新箱子 */            num += (a-aa+35)/36;        printf("%d\n", num);    }    return 0;}


 

# include <stdio.h>
# include <stdlib.h># include <string.h># include <string>int s[7];int go () {int ans = s[6];int t, t1, t2;ans += s[5];t = s[1] / 11;if (t >= s[5]) {s[1] -= s[5] * 11;}else {s[1] = 0;}//printf ("the ans is %d\n", ans);t = s[2] / 5;ans += s[4];if (t >= s[4]) {s[2] -= s[4] * 5;}else {t1 = s[4] - t;t2 = s[2] % 5;s[2] = 0;s[1] += t2 * 4;t = s[1] / 20;if (t >= t1) s[1] -= t1 * 20;else s[1] = 0;}//printf ("the ans is %d\n", ans);t = s[3] / 4;ans += t;t = s[3] % 4;if(t) {++ ans;t = 4 - t;t1 = t * 2 - 1;if(s[2] >= t1) {s[2] -= t1;t2 = t * 9 - t1 * 4;if(s[1] >= t2) s[1] -= t2;else s[1] = 0;}else {s[1] += s[2] * 4;s[2] = 0;t1 = s[1] / (9 * t);if (t1) s[1] -= 9 * t;else s[1] = 0;}}//printf ("the ans is %d\n", ans);t = s[2] / 9;ans += t;s[1] += (s[2] - t * 9) * 4;t = s[1] / 36;ans += t;if (s[1] % 36) ++ ans;printf ("%d\n", ans);return ans;}int main () {while ((scanf("%d %d %d %d %d %d", &s[1], &s[2], &s[3], &s[4], &s[5], &s[6]), s[1] + s[2] + s[3] + s[4] + s[5] + s[6])) {go();}return 0;}