poj 1948 二维01背包

dp[i][j]代表能否组成一边长为i和一边长为j的三角形,剩下的一边就是sum-i-j了

接下来就是背包的做法了

#include<stdio.h>
#include<math.h>
#include<string.h>
bool dp[810][810];
int get_area(int x,int y,int z)
{
	double p=(x+y+z)/2.0;
	return int(sqrt(p*(p-x)*(p-y)*(p-z))*100);
}
int  max(int a,int b)
{
	return a>b?a:b;
}
int a[50];
int main()
{
	int n,i,j,k,sum=0;
    scanf("%d",&n);
	for(i=1;i<=n;i++) 
	{
		scanf("%d",&a[i]);
		sum+=a[i];
	}
	int tmp=sum;
	sum/=2;sum++;
	memset(dp,false,sizeof(dp));
	dp[0][0]=true;
	for(i=1;i<=n;i++)
	{
		for(j=sum;j>=0;j--)
		{
			for(k=sum;k>=0;k--)
			{
				if(j>=a[i]&&dp[j-a[i]][k]
					||k>=a[i]&&dp[j][k-a[i]])
					dp[j][k]=true;
			}
		}
	}
    int ans=-1;
	for(i=1;i<=sum;i++)
		for(j=1;j<=i;j++)
			if(dp[i][j]) ans=max(ans,get_area(i,j,tmp-i-j));
			printf("%d\n",ans);
			return 0;
}

  

 

posted @ 2011-11-17 15:36  Because Of You  Views(440)  Comments(0Edit  收藏  举报