您的位置:首页 > Web前端 > AngularJS

poj 1948 Triangular Pastures

2011-06-18 17:58 393 查看
/*
解题报告:二维0-1背包
1、找状态为难点
2、设dp[i][j][k]为前i个木棍能够成长度为j,k的两边的三角形(1、第三边很容易求出来; 2、不考虑是否真的够成[仔细理解这句])
3、状态转移移程为:
dp[i][j][k] = dp[i-1][j][k] | dp[i][j-len[i]][k](j>=len[i]) | dp[i][j][k-len[i]](k>=len[i])
*/
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
bool dp[800][800];
int fences[40];
int n;
int sum;
int ans;
int area(int a, int b, int c)
{
double p = (a+b+c)/2.0;
return static_cast<int>(100 * sqrt(p * (p-a) * (p-b) * (p-c)));
}
int main()
{
int i, k, j;
while(cin>>n)
{
sum = 0;
for(i=0; i<n; ++i)
{
cin>>fences[i];
sum += fences[i];
}

//二维0-1背包处理
memset(dp, 0, sizeof(dp));
dp[0][0] = true;
int tempsum = sum;
sum = sum>>1;
for(i=0; i<n; ++i)
{
for(k=sum; k>=0; --k)
{
for(j=k; j>=0; --j)
{
if((dp[k-fences[i]][j]&&k>=fences[i]) || (dp[k][j-fences[i]]&&j>=fences[i]))
dp[k][j] = true;
}
}
}

//取最大面积
int nMax = 0;
ans = 0;
for(i=sum; i>=0; --i)
{
for(j=i; j>=0; --j)
{
if(dp[i][j])
{
int other = tempsum - i - j;
if(i+j>other && i+other>j && other+j>i)
{
nMax = area(other, i, j);
if(ans < nMax)
ans = nMax;
}
}
}
}
if(ans)
cout<<ans<<endl;
else
cout<<-1<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: