题目描述
和所有人一样,奶牛喜欢变化。它们正在设想新造型的牧场。奶牛建筑师Hei想建造围有漂亮白色栅栏的三角形牧场。她拥有N(3≤N≤40)块木板,每块的长度Li(1≤Li≤40)都是整数,她想用所有的木板围成一个三角形使得牧场面积最大。
请帮助Hei小姐构造这样的牧场,并计算出这个最大牧场的面积。
输入输出格式
输入格式:
第1行:一个整数N
第2..N+1行:每行包含一个整数,即是木板长度。
输出格式:
仅一个整数:最大牧场面积乘以100然后舍尾的结果。如果无法构建,输出-1。
输入输出样例
说明
样例解释:692=舍尾后的(100×三角形面积),此三角形为等边三角形,边长为4。
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 int i,j,k,N,a[45],q,tot = 0; 7 bool f[805][805]; 8 double ans = -1,an; 9 double mainji(double i,double j,double k) 10 { 11 double p; 12 p = (i + j + k) / 2; 13 return sqrt(p * (p -i) * (p - j) * (p - k)); 14 } 15 int main() 16 { 17 scanf("%d",&N); 18 for(i = 1;i <= N;i++) 19 { 20 scanf("%d",&a[i]); 21 tot += a[i]; 22 } 23 q = (tot + 1) / 2; 24 f[0][0] = true; 25 for(i = 1;i <= N;i++) //枚举每一块板子 26 { 27 for(j = q;j >= 0;j--)//一条边的最大长度为q-1,因为两边之和大于第三边可证出来 28 { 29 for(k = j;k >= 0;k--) //假设第二条边比第一条边小 30 { 31 if((j >= a[i] && f[j - a[i]][k] == true) || (k >= a[i] && f[j][k - a[i]] == true ))//判断放之前可不可能成立 32 { 33 f[j][k] = true;//先判断是否能组成一条边为j一条边为k的木棒 34 } 35 } 36 } 37 } 38 for(i = q;i >= 1;i--) 39 { 40 for(j = i;j >= 1;j--) 41 { 42 k = tot - i - j; //确定第三条边的长度 43 if(i + j > k && i + k > j && j + k > i && f[i][j] == true)//判断他是否是个三角形,并且判断i和j能不能摆出来 44 { 45 an = mainji(i,j,k); 46 if(ans < an) 47 ans = an; 48 } 49 } 50 } 51 if(ans == -1) 52 printf("-1"); 53 else 54 printf("%d",(int)(ans * 100)); 55 return 0; 56 }
**这道题我调了一个半小时,海伦公式那块最好写分函数,不写。我是过不去了,还有判断j >= a[i] && f[j - a[i]][k] == true) || (k >= a[i] && f[j][k - a[i]] == true这块注意前后顺序,否则容易RE
****最后对于他是一个背包题深感惊讶