#include
#include
#include
using namespace std;
int f[810][810];
int a[50];
void swap(int &a, int &b){
int tmp = a;
a = b;
b = tmp;
}
int san(int a,int b,int c)
{
if(a > b) swap(a,b);
if(a > c) swap(a,c);
if(b > c) swap(b,c);
if(a + b < c) return -1;
double p = (a + b + c) * 1.0 / 2;
double ret;
ret = sqrt(p * (p-a) * (p-b) * (p-c)) * 100;
return (int)ret;
}
int main(){
int n;
scanf("%d",&n);
int sum = 0;
for (int i = 0; i < n; i ++){
scanf("%d",&a[i]);
sum += a[i];
}
memset(f, 0, sizeof(f));
f[0][0] = 1;
int ban = sum / 2;
for (int k = 0; k < n; k ++){
for (int i = ban; i >= 0; i --){
for (int j = ban; j >= 0; j --){
if (i - a[k] >= 0){
f[i][j] = f[i][j] | f[i - a[k]][j];
}
if (j - a[k] >= 0){
f[i][j] = f[i][j] | f[i][j - a[k]];
}
}
}
}
int max = -1;
for (int i = 1; i <= ban; i ++){
for (int j = 1; j <= ban; j ++){
if (f[i][j]){
if (san(i, j, sum - i - j) > max){
max = san(i, j, sum - i - j);
}
}
}
}
printf("%d\n", max);
return 0;
}
POJ 1948 Triangular Pastures (二维01背包)
转载
题目链接:http://poj.org/problem?id=1948
题目大意:给最多40根木棍,每根长度不超过40,要用完所有的木棍构成面积最大的三角形,求出最大的面积。
思路:设f[i][j]为第一条边长度为i,第二条边长度为j是否可行
状态转移方程:
if(j>=a[i])
f[j][k]=f[j][k]||f[j-a[i]][k]
if(k>=a[i])
f[j][k]=f[j][k]||f[j][k-a[i]]
举杯独醉,饮罢飞雪,茫然又一年岁。 ------AbandonZHANG
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
在Java中使用二维数组生成迷宫
在Java中使用二维数组生成迷宫
深度优先搜索 Java 二维数组 -
一维和二维数组sizeof和strlen的区别
sizeof和strlen的区别
bc 一维数组 二维数组 -
8. 二维费用的背包问题(01背包)
有 N 件物品和一个容量是 V 的背包,背包能承受的最大重量是 M。每件物品只能用一次。体积是 vi,重量是 mi,价值是
动态规划 算法 ide 背包问题 输出格式 -
poj 3624 01背包
http://poj.org/problem?id=3624主要注意的是内存的优化yixiashi
#include i++ ios