李国帅 于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); }