使用C算法封装盒子的尝试

李国帅 于2006.9

通过这个程序,我发现程序最重要的就是算法和结构,在结构和算法没有弄清楚之前所有的劳动,所有的编码都是白费工夫,因此在动手之前,尽一切努力,通过各种沟通途径把逻辑关系搞清楚是最重要的事情.

十年前的东西了,这个算法有很多漏洞,条件考虑不足,不过,依然可以看作对实际问题解决的一次尝试,自己已经没有精力做这玩意了,有高手可以看看如何解决。----2017.12.22

lucy 的问题

18*14*8.5CM的盒子,25盒装一个箱子,装成方形的箱子,用那个尺寸的盒子装在一个方形的箱子里面,那个需要多大尺寸的方形箱子。

/*有这么几个限制条件
长宽高 后面加上空隙
H = 18*nx +14*ny +8.5*nz +ox
W = 18*nx +14*ny +8.5*nz +oy
L = 18*nx +14*ny +8.5*nz +oz
nx,nx,nx <= 24

最后的纸箱体积
H * W * L = 25*18*14*8.5 + OV
必须使的空余的体积OV最小。
因为长宽高的空余长度ox,oy,oz可以放在OV中计算,所以可以不用带上。
建立三级循环,依次求出正数OV,最后得到最小的OV时的nx,nx,nx
OV = H * W * L - 25*18*14*8.5
本来长宽高必须分别至少包含一长宽高的个数,但没有必要进行过多的判断。
长度、宽度,高度上分别至少有一个nx,nx,nx
那也不行,对于每一个长都要求一个宽,然后要求一个高。
所以需要9级循环,可以使用递归,最后再说。
*/
#include <windows.h>
#include <stdio.h>
#include <math.h>
#include <process.h>
#define WORDMAXLEN 1024

//double L=0,W=0,H=0;
int vNum = 3;
double HWL[3] = { 0, 0, 0 };//H,W,L
double OV = 0.0;
double l = 18, w = 14, h = 8.5;
double minLine = h;
double maxLine = l;
int MaxNum = 25;
double TV = MaxNum*l*w*h;
double MinOV = 100000000000.0;
double MinH = 0, MinW = 0, MinL = 0;
FILE *stream;
int nxyz[3][3];
void getV(double& hwl, int nHWL, int LeftNum)
{

    if (nHWL >= 0)
    {
        int nx = 0, ny = 0, nz = 0;
        for (nx = 0; nx <= LeftNum; nx++)
        {
            for (ny = 0; ny <= LeftNum; ny++)
            {
                for (nz = 0; nz <= LeftNum; nz++)
                {
                    if (nx + ny + nz > LeftNum) continue;
                    hwl = l*nx + w*ny + h*nz;
                    if (hwl < minLine) continue;
                    nxyz[nHWL][0] = nx;
                    nxyz[nHWL][1] = ny;
                    nxyz[nHWL][2] = nz;
                    if (nHWL == 0)
                    {
                        //长宽高必须整除包装件的长宽高
                        if ((int)((HWL[nHWL] + HWL[nHWL + 1] + HWL[nHWL + 2]) * 10) % (int)((l + w + h) * 10) != 0)continue;
                        //长宽高不能有一个是0
                        if (nxyz[0][0] + nxyz[1][0] + nxyz[2][0] == 0)continue;
                        if (nxyz[0][1] + nxyz[1][1] + nxyz[2][1] == 0)continue;
                        if (nxyz[0][2] + nxyz[1][2] + nxyz[2][2] == 0)continue;
                        //最小长度 >
                        if (HWL[nHWL] > maxLine && HWL[nHWL + 1] > maxLine && HWL[nHWL + 2] >= maxLine)
                        {
                            OV = HWL[nHWL] * HWL[nHWL + 1] * HWL[nHWL + 2] - TV;
                            if (OV > 0.00001)
                            {
                                //if (OV < MinOV)
                                {
                                    MinOV = OV;
                                    MinH = HWL[nHWL];
                                    MinW = HWL[nHWL + 1];
                                    MinL = HWL[nHWL + 2];
                                }
                                if (MinOV > 1500)continue;

                                fprintf(stream, "nHWL(%d)HWL2(%.1f)HWL1(%.1f)HWL0(%.1f)MinOV(%.2f)\n", nHWL, HWL[nHWL], HWL[nHWL + 1], HWL[nHWL + 2], MinOV);
                                fprintf(stream, "L: nx,ny,nz %d,%d,%d \n", nxyz[0][0], nxyz[0][1], nxyz[0][2]);
                                fprintf(stream, "W: nx,ny,nz %d,%d,%d \n", nxyz[1][0], nxyz[1][1], nxyz[1][2]);
                                fprintf(stream, "H: nx,ny,nz %d,%d,%d \n", nxyz[2][0], nxyz[2][1], nxyz[2][2]);
                            }
                        }
                    }
                    else
                        getV(HWL[nHWL - 1], nHWL - 1, LeftNum / (nx + ny + nz));
                }
            }
        }
    }
}
int main(int argc, char **argv)
{
    stream = fopen("D:\\out.txt", "w");
    getV(HWL[vNum - 1], vNum - 1, MaxNum);
    fclose(stream);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微澜-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值