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为三边长的三角形.如果存在,…
题目地址:http://poj.org/problem?id=1948 题目大意: 给N条边,把这些边组成一个三角形,问面积最大是多少?必须把所有边都用上. 解题思路: 根据题意周长c已知,求组合三边长使得三角形面积最大.如果直接DFS的话,每次考虑每根木棍放在哪一条边上,爆搜,可以加上每条边不会大于周长的一半的剪枝.根据数据规模,仍会超时,所以可以考虑采用动态规划.因为周长c已知,所以只需考虑其中两条边即可.类似二维0-1背包的做法,开一个二维判定数组f[i][j],i代表第一条边长为i,j为…
题意:给出n条边,用这n条边构成一个三角形,求三角形的最大面积. 先求面积,用海伦公式,s=sqrt(p*(p-a)*(p-b)*(p-c)),其中a,b,c分别为三角形的三条边,p为三角形的半周长,同时由这个根式可以推出,三角形的任意一条边小于其半周长(根号里面大于0,如果等于0面积为0没有意义了) 所以考虑背包两条边,再用周长减去这两条边求出第三条边,再遍历一遍找出最大的三角形. dp[i][j]表示三角形的第一条边为i,第二条边为j所构成的三角形是否存在, 如果存在,dp[i][j]=1,…
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 triang…
题意:给出不多于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数组求最大面积. 代码: #include<iostream> #include<cstring> #include&…
题意: 把很多单独的线段重新组合成一个三角形,使得三角形面积最大(所有的线段都必须用上). 思路: 三角形的任意一条边的边长不能超过周长的一半,只需要用dp枚举两条边j,k,剩下的一条边长为tot  - j - k;判断枚举出的这三条边是否能组成三角形,用海伦公式求出面积 代码: #include <map> #include <set> #include <stack> #include <queue> #include <cmath> #in…
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(…
这道题我记得是携程比赛上的一道. 开始时想直接设面积,但发现不可以,改设能否构成三角形.设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 &l…
题意:给你n个木棍(n<=40)每个木棍长度<=40,问用上所有的木棍拼成的三角形的面积的最大值,并输出面积*100的值(不四舍五入) 如果没有解,输出-1. 思路: 背包判断可达性. f[j][k]表示能拼成一个长度为j的边,一个长度为k的边. 所以 if(f[j][k]&&j+a[i]<=800&&k+a[i]<=800) f[j+a[i]][k]=f[j][k+a[i]]=1; 因为三角形的周长是一定的,可以求出剩下那条边的长度. 用余弦定理可…
★.背包求方案数的时候,多重背包是不行的,因为产生重复的背包会有多种情况. ★.背包记录路径的时候,其实是不行的,因为更新了12的最优解,如果它依赖于6这个背包,然后你后面改变了6这个背包,就GG 1.01背包问题. tot:总背包空间,vall[i]:每件物品的价值,w[i]:每件物品的重量 http://acm.hdu.edu.cn/showproblem.php?pid=2602 01背包明显可以只写一维的,所以二维的就不写了. 关于为什么可以只写一维的呢?这就和你枚举的顺序有关了.从to…