开始完全没有思路,不知如何贪心下手,后来看到这篇博主的结题报告,研究了会才搞懂
然后自己仿照着写,到situation5(就是第6幅图,4,5图一种情况)时还是出错了,后来想想我少考虑了一种情况
自己的是max2(a.width+b.width,c.width+d.width),应该是max3(a.width+b.width,c.width+d.width,b.width+d.width)
1 /* 2 3 ID: hubiao cave 4 5 PROG: packrec 6 7 LANG: C++ 8 9 */ 10 11 12 13 14 #include15 #include 16 #include 17 #include 18 #include 19 using namespace std; 20 21 //#define max2(a,b) (a>b?a:b) 22 //#define max3(a,b,c) (a>max2(b,c)?a:max2(b,c)) 23 //#define max4(a,b,c,d) (a>max3(b,c,d)?a:max3(b,c,d)) 24 25 int max2(int a,int b) 26 { 27 return a>b?a:b; 28 } 29 int max3(int a,int b, int c) 30 { 31 return max2(max2(a,b),c); 32 } 33 int max4(int a,int b,int c,int d) 34 { 35 return max2(max2(a,b),max2(c,d)); 36 } 37 38 39 40 struct rect 41 { 42 int width; 43 int height; 44 }; 45 rect rc[4]; 46 int index[4]={ 0,1,2,3}; 47 48 void swap(rect&); 49 50 void work(rect,rect,rect,rect); 51 52 void situ1(rect,rect,rect,rect); 53 void situ2(rect,rect,rect,rect); 54 void situ3(rect,rect,rect,rect); 55 void situ4(rect,rect,rect,rect); 56 void situ5(rect,rect,rect,rect); 57 58 bool operator<(const rect& rc1,const rect&rc2) 59 { 60 return rc1.width sr; 67 68 int main() 69 70 { 71 72 ifstream fin("packrec.in"); 73 ofstream fout("packrec.out"); 74 for(int i=0;i<4;i++) 75 { 76 fin>>rc[i].height>>rc[i].width; 77 } 78 79 for(int i=0;i<2;i++) 80 { 81 swap(rc[0]); 82 for(int j=0;j<2;j++) 83 { 84 swap(rc[1]); 85 for(int m=0;m<2;m++) 86 { 87 swap(rc[2]); 88 for(int n=0;n<2;n++) 89 { 90 swap(rc[3]); 91 92 do 93 { 94 work(rc[index[0]],rc[index[1]],rc[index[2]],rc[index[3]]); 95 96 } while (std::next_permutation(index,index+4)); 97 } 98 } 99 }100 }101 102 fout< < ::iterator it=sr.begin();it!=sr.end();it++)104 {105 fout<<(*it).width<<" "<<(*it).height< =a.height+d.height)152 {153 maxw=max2(max2(a.width,d.width)+c.width,b.width);154 }155 else156 {157 if(c.height>=d.height)158 {159 maxw=max3(a.width+b.width,c.width+d.width,a.width+c.width);160 }161 if(c.height d.height)162 {163 maxw=max3(a.width+b.width,c.width+d.width,b.width+d.width);164 }165 if(b.height+c.height<=d.height)166 {167 maxw=max2(a.width,max2(b.width,c.width)+d.width);168 }169 170 171 }172 update(maxh,maxw);173 }174 175 176 void update(int wid,int height)177 {178 rect rc1;179 int area=wid*height;180 181 if(wid>height)182 {183 int temp=height;184 height=wid;185 wid=temp;186 }187 rc1.height=height;188 rc1.width=wid;189 190 if(area