POJ 1948 Triangular Pastures 二维 0-1背包
题意:给了n个边,要求每条都用上,组成一个三角形,求三角形面积最大值的100倍(取整数);
分析:我们可以开个二维数组dp[i][j]来记录三角形的两条边的长度i,j,那么另一条边就是总长度减去i和j。
疑问:判定能构成三角形的条件,设p为三角形的半周长,a+b>c 两边同时加上c 则 2*p >2*c 即 p>c,同理p>a,p>b。
由海伦公式S=sqrt(p*(p-a)*(p-b)*(p*c))也可以得出这结论 。
View Code
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; bool dp[802][802]; int a[42]; double cal(int a, int b, int c,double p)//海伦公式 { if(a>=p||b>=p||c>=p)return -1.0; return sqrt(p*(p-a)*(p-b)*(p-c)); } int main() { int n, i, j, k, sum, s; while(~scanf("%d",&n)) { sum = 0; for(i=1;i<=n;i++) scanf("%d",&a[i]),sum+=a[i]; s= sum/2; memset(dp,0,sizeof(dp)); dp[0][0]=1; for(i=1;i<=n;i++) for(j=s;j>=0;j--) for(k=s;k>=0;k--) if(dp[j-a[i]][k]&&j>=a[i]||dp[j][k-a[i]]&&k>=a[i])dp[j][k]=1; double maxx=-2.0; for(i=1;i<=s;i++) for(j=1;j<=s;j++) if(dp[i][j]) { double val=cal(i,j,sum-i-j,sum*1.0/2); if(maxx<val)maxx=val; } if(maxx==-1.0)printf("-1\n"); else printf("%d\n",(int)(maxx*100)); } return 0; }


浙公网安备 33010602011771号