zoukankan      html  css  js  c++  java
  • POJ 2392 Space Elevator 背包题解

    多重背包。本题不须要二分优化。相对简单点。由于反复数十分小,小于10。

    而添加一个限制每种材料的高度做法。假设使用逆向填表,那么仅仅须要从这个高度往小递归填表就能够了。

    还有就是注意要排序,以限制高度为标准从小到大排序。否则答案错误的。

    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using std::sort;
    
    const int MAX_K = 401;
    const int MAX_H = 40001;
    struct HCA
    {
    	int h, a, c;
    	bool operator<(const HCA &hac)
    	{
    		return a < hac.a;
    	}
    };
    HCA hca[MAX_K];
    bool tbl[MAX_H];
    
    inline int max(int a, int b) { return a > b ? a : b; }
    
    int bagDP(int B)
    {
    	memset(tbl, 0, sizeof(tbl));
    	tbl[0] = true;
    	for (int i = 1; i <= B; i++)
    	{
    		int k = 1;
    		for ( ; (k << 1) <= hca[i].c; k <<= 1)
    		{
    			for (int j = hca[i].a; j >= hca[i].h*k; j--)
    				if (tbl[j-hca[i].h*k]) tbl[j] = true;
    		}
    		k = hca[i].c - k + 1;
    		for (int j = hca[i].a; j >= hca[i].h*k; j--)
    			if (tbl[j-hca[i].h*k]) tbl[j] = true;
    	}
    	int i = MAX_H - 1;
    	for (; i > 0 && !tbl[i]; i--);
    	return i;
    }
    
    int main()
    {
    	int blocks;
    	scanf("%d", &blocks);
    	for (int i = 1; i <= blocks; i++)
    	{
    		scanf("%d %d %d", &hca[i].h, &hca[i].a, &hca[i].c);
    	}
    	sort(hca, hca+blocks+1);
    	printf("%d
    ", bagDP(blocks));
    	return 0;
    }




  • 相关阅读:
    centos7开启关闭防火墙
    虚拟机vmnet1和vmnet8找不到,注册表没有删除干净,见图
    dhcp和static的区别
    SQL手册
    canal架构原理
    SQL优化(待完善)
    数仓简介
    java逆变与协变(待完善)
    mysqljoin的原理和优化
    深入理解java虚拟机阅读笔记
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5259833.html
Copyright © 2011-2022 走看看