Triangular Pastures POJ - 1948

sum表示木条的总长。a[i]表示第i根木条长度。ans[i][j][k]表示用前i条木条,摆成两条长度分别为j和k的边是否可能。

那么ans[i][j][k]=ans[i-1][j-a[i]][k] || ans[i-1][j][k-a[i]]

可以用滚动数组优化。

最后在ans[n]中枚举i和j,如果ans[n][i][j]为true,再算出sum-i-j的长度,判断是否存在分别以i,j,sum-i-j为三边长的三角形。如果存在,再用海伦公式算出三角形面积,用面积去更新最大面积。

错误记录:
没有在dp的时候判边界,也就是没有判j>=a[i]和k>=a[i]。

 #include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long LL;
bool ans[][];
LL a[],n,sum;
double p,anss;
int main()
{
LL i,j,k,x,y,z;
scanf("%lld",&n);
for(i=;i<=n;i++)
{
scanf("%lld",&a[i]);
sum+=a[i];
}
ans[][]=;
for(i=;i<=n;i++)
for(j=sum;j>=;j--)
for(k=sum;k>=;k--)
{
if(j>=a[i])
ans[j][k]|=ans[j-a[i]][k];
if(k>=a[i])
ans[j][k]|=ans[j][k-a[i]];
}
for(x=;x<=sum;x++)
for(y=x;y<=sum-x-;y++)
{
if(!ans[x][y]) continue;
z=sum-x-y;
if(y>z) break;
if(x+y<=z) continue;
p=(double)(x+y+z)/2.0;
anss=max(anss,sqrt(p*(p-x)*(p-y)*(p-z)));
}
if(anss!=0.0)
printf("%lld",(long long)(anss*(double)));
else
printf("-1");
return ;
}

最新文章

  1. MySQL源码分析:源码文件结构及主要数据结构
  2. 用Javascript取float型小数点
  3. jqGrid学习笔记(二)
  4. yeild
  5. Parsing HTML with C++ (using Qt preferably) - Stack Overflow
  6. 【Python】Python 基础知识
  7. IOS本地日志记录方案
  8. vue的一些坑(第一天)
  9. 使用SQL 提示优化sql
  10. Java开源生鲜电商平台-异常模块的设计与架构(源码可下载)
  11. 大数据处理N!(21&lt;N&lt;2000)
  12. Golang的md5 hash计算
  13. 记录一次php连接mssql的配置
  14. NLP笔记:词向量和语言模型
  15. 第二章 flex输入输出结构
  16. 怎样从外网访问内网Jetty?
  17. P3959 宝藏
  18. webshell文件下载器
  19. Windows下安装Oracle12C(二)
  20. javascript使用jQuery加载CSV文件+ajax关闭异步

热门文章

  1. 【Git使用具体解释】Egit的经常使用操作具体解释
  2. VC++ 2010编译错误 fatal error C1189 error This file requires _WIN32_WINNT to be #defined at least
  3. spring理解一
  4. 微信小程序之 SideBar(侧栏分类)
  5. Linux经常使用命令(更新中)
  6. C++实现KMP模式匹配算法
  7. 使用7zip压解各种文件的经常使用命令
  8. Android-shareSDK
  9. ExtJs中多个form情况下指定某个form使能
  10. MUI日期选择控件