poj 1948
题意:给定n根长度的木棍,求围成的三角形中面积最大的那个。
找好状态就好办。
dp[i][j][k]=dp[i-1][j][k]||dp[i][j-a[i]][k]||dp[i][j][k-a[i]];
dp[i][j][k]表示前i跟木棒可构成长度j,与长度k。
代码:
#include<iostream>
#include<fstream>
#include<cmath>
using namespace std;
int n;
int a[41];
bool dp[41][1000][1000];
int sum=0;
int ok(int s,int t,int k){
double p=sum/2.;
return (int)100*sqrt(p*(p-s)*(p-t)*(p-k));
}
void read(){
// ifstream cin("in.txt");
int i,j,k,s;
int ans=-1;
cin>>n;
sum=0;
for(i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
}
dp[1][a[1]][0]=1;
dp[1][0][a[1]]=1;
for(i=2;i<=n;i++)
for(j=0;j<=sum/2;j++)
for(k=0;k+j<sum;k++)
{
dp[i][j][k]=dp[i-1][j][k];
if(j>=a[i])
dp[i][j][k]=dp[i][j][k]||dp[i-1][j-a[i]][k];
if(k>=a[i])
dp[i][j][k]=dp[i][j][k]||dp[i-1][j][k-a[i]];
}
for(i=1;i<=sum/2;i++)
for(j=max(sum/2-i,1);j+i<sum;j++)
{
k=sum-i-j;
if(dp[n][i][j]&&i+j>k&&i+k>j&&j+k>i&&(s=ok(i,j,k))>ans)
ans=s;
}
cout<<ans<<endl;
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号