所谓的二维背包Triangular Pastures POJ 1948
生活随笔
收集整理的這篇文章主要介紹了
所谓的二维背包Triangular Pastures POJ 1948
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這題WA了很多遍,要不就是測試數據 3 1 2 3 輸出173,要不就是6 5 5 5 5 5 5? 輸出-1.甚至有時候把程序改的題目上的測試數據都過不了,各種悲摧,其實我喜歡邊寫程序邊想,這是個很差的習慣,我一定要改!!!這題是看別人的提示寫出來的,首先設bool型數組f,令 f[i][j]表示一邊長為i,另一邊長為j的邊可以組合出來,然后在所有可以組合出來的情形中找能組合成三角形且面積最大的。f[i][j]能組合出來的條件是對于加入新邊li來說是f[i-li][j] 或f[i][j-li]能組合出來,初始條件是f[0][0]能組合出來。因為題目中說了要用掉所有的欄桿,所以我只考慮兩條邊,剩下的一條邊用總長剪這兩條邊的長就知道了,然后為了這兩天邊的列舉有對稱性,可假設i>= j也算是減少運算量吧。能組成三角形的條件是任意兩邊之和大于第三邊,我令第一條邊長i <= (總長-1)/2(稍微想一下就知道了,分奇偶討論一下)第二條邊長<= i且和 i一起滿足2*(i+j) > 總長,這樣的三條邊就一定是能組成三角形的了``````
View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 bool f[900][900]; 5 int main() 6 { 7 int n,l[50]; 8 int sum =0; 9 scanf("%d",&n); 10 for(int i=0; i< n; i++) 11 { 12 scanf("%d",&l[i]); 13 sum += l[i]; 14 } 15 int m1; 16 m1=(sum-1)/2; 17 memset(f,false,sizeof(f)); 18 f[0][0] = true; 19 for(int i=0; i< n; i++) 20 { 21 for(int j = m1; j >= 0; j--) 22 { 23 for(int k = j; k>=0; k--) 24 { 25 if((j>=l[i] &&f[j-l[i]][k]) || (k >= l[i] && f[j][k - l[i]])) 26 f[j][k] = true; 27 } 28 } 29 } 30 double max = 0; 31 bool flag= false; 32 for(int j=m1; j>0; j--) 33 { 34 for(int k = j; 2*(j+k) > sum; k--) 35 { 36 double t=(sum-2*j)*(sum-2*k)*(2*(j+k)-sum)/8.0; 37 if(f[j][k] && t> max) 38 { 39 flag =true; 40 max = t; 41 } 42 } 43 } 44 if(!flag) 45 printf("-1\n"); 46 else 47 { 48 max = sum/2.0*max; 49 int d = (floor)(sqrt(max)*100); 50 printf("%d\n",d); 51 } 52 return 0; 53 }?
?
轉載于:https://www.cnblogs.com/allh123/archive/2013/03/27/2985260.html
總結
以上是生活随笔為你收集整理的所谓的二维背包Triangular Pastures POJ 1948的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 基本事件及对话框
- 下一篇: ANT-build.xml文件详解