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;
}

posted on 2011-02-27 18:32  宇宙吾心  阅读(379)  评论(0)    收藏  举报

导航