poj 1948(背包)

来源:互联网 发布:淘宝网站的盈利模式 编辑:程序博客网 时间:2024/05/16 02:11
//思路是看大神的


//把三角型的一边当成一维费用 另一边当做另一维费用 
//第三边可以通过sum-第一边-第二边得到
//每一根棒子作为一个物品 棒子的长度作为物品的费用
//所有棒子长度和的一半作为背包的大小 因为三角形任意一条边长不可能超过总长的一半


#include<stdio.h>
#include<string.h>
#include<math.h>


#define N 1700/2


int dp[N][N];
int c[50];
int n;
int sum;
int v;


int main()
{
int i,j,k;
sum=0;


while(scanf("%d",&n)!=EOF)
{
sum=0;
for(i=1;i<=n;i++)
{
scanf("%d",&c[i]);
sum+=c[i];
}
v=sum/2;
memset(dp,0,sizeof(dp));
dp[0][0]=1;


for(i=1;i<=n;i++)
{
for(j=v;j>=0;j--)
{
for(k=v;k>=0;k--)
{
if(j>=c[i]&&dp[j-c[i]][k]||k>=c[i]&&dp[j][k-c[i]])
dp[j][k]=1;
}
}
}

double ans=0;


for(i=1;i<=v;i++)
{
for(j=1;j<=v;j++)
{
if(dp[i][j])
{
int q=sum-i-j;
double t=sum*1.0/2;
if(i+j>q&&i+q>j&&j+q>i)
{
double an=sqrt(t*(t-i)*(t-j)*(t-q)*1.0);
if(ans<an*100)
ans=an*100;
}
}
}
}
if(ans-0<=1e-10)
ans=-1;
printf("%d\n",(int)ans);
}
return 0;
}

0 0