zoukankan      html  css  js  c++  java
  • 二维背包——poj1948

    http://poj.org/problem?id=1948

    题目描述:给最多40根木棍,每根长度不超过40,要用完所有的木棍构成面积最大的三角形,求出最大的面积。

    f[j][k] 表示能否达到一边长为 j,另一边长为k

    if(j>=a[i])

    f[j][k]=f[j][k]||f[j-a[i]][k]

    if(k>=a[i])

    f[j][k]=f[j][k]||f[j][k-a[i]]

    View Code
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<iostream>
    using namespace std;

    bool f[809][809];
    int a[49];

    int san(int a,int b,int c)
    {
    if(a>b)swap(a,b);
    if(a>c)swap(a,c);
    if(b>c)swap(b,c);

    if(a+b<c)return -1;
    double p=(a+b+c)*1.0/2;
    double ret;
    ret=sqrt(p*(p-a)*(p-b)*(p-c))*100;

    return (int)ret;
    }

    int main()
    {
    int n;
    while(scanf("%d",&n)!=EOF)
    {
    int i,j,k,all=0,ban;
    for(i=1;i<=800;i++)
    {
    for(j=0;i<=800;i++)
    {
    f[i][j]=0;
    }
    }


    f[0][0]=1;
    for(i=1;i<=n;i++)
    {
    scanf("%d",&a[i]);
    all+=a[i];
    }
    ban=all/2;

    for(i=1;i<=n;i++)
    {
    for(j=ban;j>=0;j--)
    {
    for(k=ban;k>=0;k--)
    {
    if(j>=a[i])
    f[j][k]=f[j][k]||f[j-a[i]][k];
    if(k>=a[i])
    f[j][k]=f[j][k]||f[j][k-a[i]];
    }
    }
    }

    int max=-1,t;
    for(i=1;i<=ban;i++)
    {
    for(j=1;j<=ban;j++)
    {
    if(f[i][j]==0)continue;

    t=san(all-i-j,i,j);
    if(t>max)
    max=t;
    }
    }

    printf("%d\n",max);
    }
    }



  • 相关阅读:
    1029: [JSOI2007]建筑抢修
    1028: [JSOI2007]麻将
    1050 棋盘染色 2
    1026: [SCOI2009]windy数
    1074: [SCOI2007]折纸origami
    839. Optimal Marks
    1024: [SCOI2009]生日快乐
    1025: [SCOI2009]游戏
    1023: [SHOI2008]cactus仙人掌图
    对前面的总结
  • 原文地址:https://www.cnblogs.com/huhuuu/p/2277245.html
Copyright © 2011-2022 走看看