题目地址:http://poj.org/problem?id=1948

题目大意:

给N条边,把这些边组成一个三角形,问面积最大是多少?必须把所有边都用上。

解题思路:

根据题意周长c已知,求组合三边长使得三角形面积最大。如果直接DFS的话,每次考虑每根木棍放在哪一条边上,爆搜,可以加上每条边不会大于周长的一半的剪枝。根据数据规模,仍会超时,所以可以考虑采用动态规划。因为周长c已知,所以只需考虑其中两条边即可。类似二维0-1背包的做法,开一个二维判定数组f[i][j],i代表第一条边长为i,j为第二条边长为j,则第三条边长为c-i-j,判定所有情况。最后验证即可。因为三角形每条边长不可能超过周长的一半,所以枚举i,j最大到c/2即可。最后注意结果小数部分不是四舍五入,而是直接截断的,所以可以利用强制转化。

DP代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
using namespace std;
const int N=*;
int f[N][N];
int a[],c=,n; int main()
{ scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
c+=a[i];
} memset(f,,sizeof(f));
f[][]=;
for(int i=;i<=n;i++){
for(int j=c/+;j>=;j--){
for(int k=c/+;k>=;k--){
if(j-a[i]>= && f[j-a[i]][k]){
f[j][k]=;
}
if(k-a[i]>= && f[j][k-a[i]]){
f[j][k]=;
}
}
}
} double s=;
for(int i=c/+;i>=;i--){
for(int j=c/+;j>=;j--){
if(f[i][j]){
double la=i,lb=j,lc=c-i-j;
double p=(la+lb+lc)/2.0;
if(sqrt(p*(p-la)*(p-lb)*(p-lc))>s){
s=sqrt(p*(p-la)*(p-lb)*(p-lc));
}
}
}
} printf("%d\n",s== ? - : (int)(s*)); return ;
}

DFS代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
using namespace std;
const int N=;
int n,sum,la=,lb=,c=,lc;
int a[N],f[N];
double s=; void dfs(int k)
{
if(la>c/ || lb>c/ || lc>c/) return ;
if(k==n){
if(la+lb>lc && la+lc>lb && lb+lc>la){
double p=(la+lb+lc)/2.0;
if(sqrt(p*(p-la)*(p-lb)*(p-lc))>s){
s=sqrt(p*(p-la)*(p-lb)*(p-lc));
}
}
return ;
}
for(int i=;i<n;i++){
if(!f[i])
for(int j=;j<;j++){
if(j==){
la+=a[i];
f[i]=;
dfs(k+);
f[i]=;
la-=a[i];
}
if(j==){
lb+=a[i];
f[i]=;
dfs(k+);
f[i]=;
lb-=a[i];
}
if(j==){
lc+=a[i];
f[i]=;
dfs(k+);
f[i]=;
lc-=a[i];
}
}
}
}
int main()
{
memset(f,,sizeof(f));
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d",&a[i]);
c+=a[i];
}
dfs();
printf("%d\n",s== ? -:(int)(s*));
return ;
}

最新文章

  1. table布局, td内部元素溢出边界问题。 (已解决)
  2. Web 播放声音(AMR 、WAVE)
  3. 计算机网络(12)-----HTTP协议详解
  4. COCOS2D-X中UI动画导致闪退与UI动画浅析
  5. iOS权限管理思路
  6. 利用脚本获取mysql的tps,qps等状态信息
  7. iOS8远程通知处理
  8. C# 前台线程与后台线程的区别和联系
  9. sqlserver 关于快照
  10. 源码来袭!!!基于jquery的ajax分页插件(demo+源码)
  11. HDOJ(HDU) 1976 Software Version(简单判断)
  12. Java Load Properties 文件,定义message信息
  13. nginx上传模块nginx_upload_module和nginx_uploadprogress_module模块进度显示,如何传递GET参数等。
  14. ios save image to album
  15. SSIS从理论到实战,再到应用(4)----流程控制之For循环
  16. html 自定义标签使用实现方法
  17. uva1625
  18. How to expand Azure VM OS Disk
  19. Windows 控制面板调用命令
  20. win的使用

热门文章

  1. 【转】TCP三次握手过程
  2. Java 中 Vector、ArrayList、List 使用深入剖析【转载】
  3. Java:Date、Calendar、Timestamp的区别、相互转换与使用【转载】
  4. 利用golang语法检查对象是否实现了接口
  5. Android实现后台长期监听时间变化
  6. Android 之 自定义标签 和 自定义组件
  7. Android各种颜色dawable.xml中定义
  8. &quot;ping: unknown host www.baidu.com&quot; 解决方法
  9. js通用对象数组冒牌排序
  10. python集合set,frozenset--笔记