poj 1948二维01背包
2013-08-14 12:49
302 查看
题意:给出不多于40个小棍的长度,求出用所有小棍组成的三角形的最大面积。
思路:三角形3边求面积,海伦公式:p=(a+b+c)/2;S=p*(p-a)*(p-b)*(p-c);因为最大周长为1600 则三角形的边长小于周长一半800;
则可以用背包思想dp[i][j]代表能组成的两条边i和j。dp为true代表小棍能组成这两条边,第三条边也能求出,最后遍历一次dp数组求最大面积。
代码:
思路:三角形3边求面积,海伦公式:p=(a+b+c)/2;S=p*(p-a)*(p-b)*(p-c);因为最大周长为1600 则三角形的边长小于周长一半800;
则可以用背包思想dp[i][j]代表能组成的两条边i和j。dp为true代表小棍能组成这两条边,第三条边也能求出,最后遍历一次dp数组求最大面积。
代码:
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #define MAXN 815 #define INF 1e8 using namespace std; bool dp[801][801]; int a[44]; int n,sum,p; int main() { while(scanf("%d",&n)!=EOF) { sum=0; for(int i=0;i<n;i++) { scanf("%d",&a[i]); sum+=a[i]; } memset(dp,0,sizeof(dp)); dp[0][0]=1; p=sum/2; for(int i=0;i<n;i++) { for(int j=p;j>=0;j--) { for(int k=j;k>=0;k--) { if((j>=a[i]&&dp[k][j-a[i]])||(k>=a[i]&&dp[k-a[i]][j])) dp[k][j]=1; } } } int ans=-1; for(int i=p;i>=1;i--) { for(int j=i;j>=1;j--) { if(dp[j][i]) { int c=sum-i-j; if(i + j > c && i + c > j && j + c > i) { double px=(i+j+c)*1.0/2; int temp=(int)(sqrt(px*(px-i)*(px-j)*(px-c))*100); if(ans<temp) ans=temp; } } } } if(ans) printf("%d\n",ans); else printf("-1\n"); } return 0; }
相关文章推荐
- poj 1948 二维01背包
- poj 1948 Triangular Pastures 二维01背包
- http://poj.org/problem?id=1948..二维01背包。。
- poj 1948 二维01背包
- poj 1948 Triangular Pastures(二维0/1背包)
- poj 1948 Triangular Pastures(01背包+暴力)
- POJ -- 1948 二维背包问题
- 所谓的二维背包Triangular Pastures POJ 1948
- poj 1948 Triangular Pastures 01背包
- POJ 1948 (Triangular Pastures)二维背包 DP/DFS
- POJ 1948 Triangular Pastures(二维背包)
- poj 1948 Triangular Pastures 二维背包
- POJ 1948 Triangular Pastures 二维 0-1背包
- POJ 1948 Triangular Pastures 二维 0-1背包
- poj 1948 二维背包
- poj 1948 Triangular Pastures (二维背包dp)
- 携程第二场 Poj 1182 食物链(带权并查集) Poj 1948 Triangular Pastures Poj(dp二维背包) 1740 A New Stone Game(博弈)
- poj3624-我的第一道01背包水题
- Bookshelf 2 POJ - 3628(01背包||DFS)
- POJ-3624 Charm Bracelet (01背包 入门题)