POJ - 1948 二维01背包
T了两发,DP方程很简单粗暴
dp[i][j][k]:用前i物品使得容量分别为j和k的背包恰好装满
背包的调用只需一次即可,第一次T就是每次check都丧心病狂地背包一次
对于sum的枚举,其实i j枚举到sum/2就可以了
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define scan(a) scanf("%d",&a)
#define rep(i,j,k) for(int i = j; i <= k; i++)
using namespace std;
const int maxn = 1666;
bool F[maxn][maxn];
int len[maxn],n;
double query(double a,double b,double c){
    double p=(a+b+c)/2.0;
    return sqrt(p*(p-a)*(p-b)*(p-c));
}
bool dp[2][maxn][maxn];
int C[maxn],W[maxn],V1,V2;
bool bag(int a,int b){
    V1=a,V2=b;
    rep(i,1,n){
        dp[i&1][0][0]=1;
        rep(j,0,V1){
            rep(k,0,V2){
                dp[i&1][j][k]|=dp[i-1&1][j][k];//not be used
                if(len[i]<=j) dp[i&1][j][k]|=dp[i-1&1][j-len[i]][k];
                if(len[i]<=k) dp[i&1][j][k]|=dp[i-1&1][j][k-len[i]];
            }
        }
    }
    return dp[n&1][V1][V2];
}
#define check(i,j) dp[n&1][i][j]
int main(){
    while(scan(n)!=EOF){
        int sum = 0;
        rep(i,1,n) scan(len[i]);
        rep(i,1,n) sum+=len[i];
        memset(F,0,sizeof F);
        double t=(double)sum/2;
        int tt=sum/2+1;
        int maxi=0,maxj=0;
        rep(i,1,tt){
            rep(j,1,tt){
                if(i+j>t){
                    F[i][j]=1;
                    maxi=i,maxj=j;
                }
            }
        }
        double ans=0;
        bag(maxi,maxj);
        rep(i,1,tt){
            rep(j,1,tt){
                int k = sum-i-j;
                if(F[i][j]&&k>=1&&i+j>k&&i+k>j&&j+k>i&&check(i,j)){
                    ans = max(ans,query(i,j,k));
                }
            }
        }
        long long aans= ans*100;
        printf("%lld\n",aans>0?aans:-1);
    }
    return 0;
}
												
											POJ - 1948 二维01背包的更多相关文章
- poj 1948二维01背包
		
题意:给出不多于40个小棍的长度,求出用所有小棍组成的三角形的最大面积. 思路:三角形3边求面积,海伦公式:p=(a+b+c)/2;S=p*(p-a)*(p-b)*(p-c);因为最大周长为1600 ...
 - hdu3496  二维01背包
		
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3496 //刚看题目以为是简单的二维01背包,but,,有WA点.. 思路:题中说,只能买M ...
 - hdu 2126 Buy the souvenirs 二维01背包方案总数
		
Buy the souvenirs Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
 - Leetcode_474. 一和零(二维01背包)
		
每个字符串看成一个物品,两个属性是0和1的个数,转换为01背包. code class Solution { public: int w[605][2]; int dp[105][105]; int ...
 - POJ 1948 Triangular Pastures【二维01背包】
		
题意:给出n条边,用这n条边构成一个三角形,求三角形的最大面积. 先求面积,用海伦公式,s=sqrt(p*(p-a)*(p-b)*(p-c)),其中a,b,c分别为三角形的三条边,p为三角形的半周长, ...
 - poj3260 平衡问题(二维01背包)
		
http://www.cnblogs.com/ziyi--caolu/p/3228090.html http://blog.csdn.net/lyy289065406/article/details/ ...
 - Triangular Pastures (二维01背包)
		
描述Like everyone, cows enjoy variety. Their current fancy is new shapes for pastures. The old rectang ...
 - HDU--2126 Buy the souvenirs(二维01背包)
		
题目http://acm.hdu.edu.cn/showproblem.php?pid=2126 分析:有两个要求,一是计算最多可以选多少中纪念品:而是计算选最多纪念品的方案有多少种, 即统计最优方案 ...
 - HDU-2159FATE(二维完全背包)
		
FATE Problem Description 最 近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务.久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完 ...
 
随机推荐
- opennebula kvm日志
			
Fri Jul :: [InM][I]: Command execution fail: 'if [ -x "/home/oneadmin/tmp/one/im/run_probes&quo ...
 - Part4_lesson4---Bootloader架构设计
			
1.第一阶段程序设计 第二阶段程序设计
 - 4.python 系统批量运维管理器之paramiko模块
			
paramiko paramiko是ssh服务最经常使用的模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. paramiko实现ssh2不外乎两个角度:SSH客户端与服务端 SS ...
 - Vim编码知识,乱码问题
			
原文:http://demi-panda.com/2012/12/26/vim-encoding/ 在vim的初始学习阶段,乱码经常是困扰新手的一个比较烦躁的问题,本文试图阐述Vim的编码知识,及设置 ...
 - 设计模式02: Abstract Factory 抽象工厂(创建型模式)
			
Abstract Factory 抽象工厂(创建型模式) 常见的对象创建方法: //创建一个Road对象 Road road=new Road(); new的问题: -实现依赖 ...
 - spring深入了解心得
			
spring 主要核心组件 :Core.上下文(Context) .实体(Bean): spring 主要由两大特色:控制反转(IOC).面向对象(AOP): spring中Core主要用于组建Bea ...
 - .NET&C#的异常处理
			
应用程序未捕获异常的处理 处理未捕获的异常是每个应用程序起码有的功能 无论是Windows窗体程序还是WPF程序,我们都看到捕获的异常当中分为"窗体线程异常"和"非窗体线 ...
 - Linux服务器其中一个磁盘满了怎么办?在不做磁盘扩容的情况下,一个软连接就搞定。
			
适用环境要求:Linux系统及服务器.有管理员权限.存在多余空间的磁盘例如下图中"/home"在磁盘sda5中与"/"不属于同一块磁盘: 1.首先转移正在使用的 ...
 - [转]解读Unity中的CG编写Shader系列3——表面剔除与剪裁模式
			
在上一个例子中,我们得到了由mesh组件传递的信息经过数学转换至合适的颜色区间以颜色的形式着色到物体上.这篇文章将要在此基础上研究片段的擦除(discarding fragments)和前面剪裁.后面 ...
 - JSON Path表达式
			
JSON Path 描述 $ 表示根元素 @ 表示当前节点 . 表示子节点 .. 选择所有符合条件的节点 * 所有节点 [] 迭代器标识,如数组下标 [,] 支持迭代器中多选 [start:en ...