POJ 1948 TRIANGULAR PASTURES(背包问题)
2011-08-20 19:06
309 查看
原文:http://blog.acmj1991.com/?p=604
题意:给你n根火柴,让你用这些火柴拼凑出一个面积最大的三角形,求这个三角形的面积
思路:想了一阵子,因为一根火柴不能同时出现在同一个边中,所以开一个二维数组
dp[i][j]记录是否存在边长为i和j的三角形,为了不重复所以从后往前推
S=sqrt(x*(x-a)*(x-b)*(x-c)); (x=S/2)
题意:给你n根火柴,让你用这些火柴拼凑出一个面积最大的三角形,求这个三角形的面积
思路:想了一阵子,因为一根火柴不能同时出现在同一个边中,所以开一个二维数组
dp[i][j]记录是否存在边长为i和j的三角形,为了不重复所以从后往前推
S=sqrt(x*(x-a)*(x-b)*(x-c)); (x=S/2)
#include<stdio.h> #include<math.h> #define maxN 1600 bool dp[maxN][maxN]; int max(int x,int y){return x>y?x:y;} int main() { int len[45],n,sum=0; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&len[i]); sum+=len[i]; } dp[0][0]=1; for(int i=0;i<n;i++) for(int j=sum/2;j>=0;j--) for(int k=sum/2;k>=0;k--) if(j>=len[i]&&dp[j-len[i]][k]||k>=len[i]&&dp[j][k-len[i]]) dp[j][k]=1; int maxx=-1; for(int i=1;i<sum/2;i++) for(int j=1;j<sum/2;j++) if(dp[i][j]) { int k=sum-i-j; if(!(i+j>k&&i+k>j&&k+j>i))continue; double m=(i+j+k+0.0000001)/2.0; int s=100*sqrt(double(m*(m-i)*(m-j)*(m-k))); maxx=max(maxx,s); } printf("%d\n",maxx); }
相关文章推荐
- POJ -- 1948 二维背包问题
- 背包问题--POJ 1948 Triangular Pastures[二维01背包]
- 【转载】poj 1276 Cash Machine 【凑钱数的问题】【枚举思路 或者 多重背包解决】
- poj 2063 完全背包问题
- POJ 1384 && HDU 1114 Piggy-Bank(完全背包问题)
- Dividing----POJ_1014----多重背包问题
- POJ_2063_背包问题
- POJ 3260 The Fewest Coins(背包问题)
- poj 2063 Investment(背包问题)(解题报告)
- poj 2063 Investment 动态规划 完全背包问题
- POJ 1417 True Liars(路径压缩并查集+DP背包问题)
- POJ_1014 Dividing(多重背包问题)
- POJ 3132 Sum of Different Primes ( 满背包问题)
- POJ 1384 完全背包问题
- poj 1014 多重背包问题
- Rebuilding Roads POJ - 1947 简单树形DP加背包问题
- POJ 1276 Cash Machine(多重背包问题)
- 经典背包问题 POJ 3624
- POJ 2229 Sumsets 完全背包问题
- http://poj.org/problem?id=3628 背包问题还有一个地方没想明白 直接DFS()