POJ 1948

这道题我记得是携程比赛上的一道。

开始时想直接设面积,但发现不可以,改设能否构成三角形。设dp[i][j][k]为前i根木棍构成边长为j和k的三角形,那么转移可以为dp[i][j][k]=dp[i-1][j-len[i]][k]|dp[i-1][j][k-len[i]]。当发现可以构成三角形时,再用海伦公式求出三角形面积即可。

由于边长不应该超过总长一半,所以,DP范围只在一半即可。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;

bool dp[810][810];
int n;
int len[50];

int main(){
	while(scanf("%d",&n)!=EOF){
		double sum,p;
		sum=0;
		for(int i=1;i<=n;i++){
			scanf("%d",&len[i]);
			sum+=len[i];
		}
		p=sum/2;
		memset(dp,false,sizeof(dp));
		dp[0][0]=true;
		for(int i=1;i<=n;i++){
			for(int j=p;j>=0;j--){
				for(int k=p;k>=0;k--){
					if(j>=len[i]){
						dp[j][k]=dp[j][k]|dp[j-len[i]][k];
					}
					if(k>=len[i])
					dp[j][k]=dp[j][k]|dp[j][k-len[i]];
				}
			}
		}
		double ans=-1;
		for(int i=0;i<=p;i++){
			for(int j=0;j<=p;j++){
				if(dp[i][j]){
					double area=sqrt(p*(p-i)*(p-j)*(p-(sum-i-j)));
					ans=max(ans,area);
				}
			}
		}
		if(ans>0){
			printf("%d\n",int(ans*100));
		}
		else printf("-1\n");
	}
	return 0;
}

  

时间: 2024-08-06 14:52:51

POJ 1948的相关文章

POJ 1948 Triangular Pastures(DP)

Description Like everyone, cows enjoy variety. Their current fancy is new shapes for pastures. The old rectangular shapes are out of favor; new geometries are the favorite. I. M. Hei, the lead cow pasture architect, is in charge of creating a triangu

Triangular Pastures POJ - 1948

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) poj 1948

Triangular Pastures Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6783   Accepted: 2201 Description Like everyone, cows enjoy variety. Their current fancy is new shapes for pastures. The old rectangular shapes are out of favor; new geo

POJ 1948 Triangular Pastures(二维背包)

Triangular Pastures Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6774   Accepted: 2199 Description Like everyone, cows enjoy variety. Their current fancy is new shapes for pastures. The old rectangular shapes are out of favor; new geo

POJ - 1948 二维01背包

T了两发,DP方程很简单粗暴 dp[i][j][k]:用前i物品使得容量分别为j和k的背包恰好装满 背包的调用只需一次即可,第一次T就是每次check都丧心病狂地背包一次 对于sum的枚举,其实i j枚举到sum/2就可以了 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> #define scan(a) scanf(

背包九讲 &amp;&amp; 题目

1.01背包问题. tot:总背包空间,vall[i]:每件物品的价值,w[i]:每件物品的重量 http://acm.hdu.edu.cn/showproblem.php?pid=2602 01背包明显可以只写一维的,所以二维的就不写了. 关于为什么可以只写一维的呢?这就和你枚举的顺序有关了.从tot 枚举 到 w[i].那么是优先更新dp[比较大的数] 而且是从dp[i - 1][]那里更新过来的.至于后面枚举小的背包容量的时候,较大的背包容量是用不了的了,所以这里就可以避免有重复使用的bu

ACM训练方案-POJ题目分类

ACM训练方案-POJ题目分类 博客分类: 算法 ACM online Judge 中国: 浙江大学(ZJU):http://acm.zju.edu.cn/ 北京大学(PKU):http://acm.pku.edu.cn/JudgeOnline/ 杭州电子科技大学(HDU):http://acm.hdu.edu.cn/ 中国科技大学(USTC):http://acm.ustc.edu.cn/ 北京航天航空大学(BUAA)http://acm.buaa.edu.cn/oj/index.php 南京

转载:poj题目分类(侵删)

转载:from: POJ:http://blog.csdn.net/qq_28236309/article/details/47818407 按照ac的代码长度分类(主要参考最短代码和自己写的代码) 短代码:0.01K–0.50K:中短代码:0.51K–1.00K:中等代码量:1.01K–2.00K:长代码:2.01K以上. 短:1147.1163.1922.2211.2215.2229.2232.2234.2242.2245.2262.2301.2309.2313.2334.2346.2348

poj题库分类

初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法:     (1)图的深度优先遍历和广度优先遍历.     (2)最短路径算法(dijkstra,bellman-ford,floyd,hea