poj 2392 Space Elevator

来源:互联网 发布:admaster数据分析 编辑:程序博客网 时间:2024/06/02 03:20

多重背包的处理,处理之前,需要根据题目的要求将各个block的容量从小到大进行排序,之后进行多重背包处理。

#include<iostream>#include<string.h>#include<math.h>#include<fstream>#include<algorithm>#include<stdio.h>#include<queue>#include<vector> #define MAXSIZE 100using namespace std;const int INF = 1<<30; #define max(a, b) ((a) > (b) ? (a) : (b))#define min(a, b) ((a) < (b) ? (a) : (b)) int K = 0;struct node{    int h, a, c;}; bool comp (const node a, const node b){    return a.a < b.a;}node blocks[410];int dp[40100];int ans = 0, rec = 0, maxn = 0;int main(){    //freopen("data_2392.txt","r",stdin);    while(scanf("%d", &K) != EOF)    {        memset(dp, 0, sizeof(dp));         for (int i = 0; i < K; i++)        {            scanf("%d%d%d", &blocks[i].h, &blocks[i].a, &blocks[i].c);        }        sort (blocks, blocks + K, comp);        dp[0] = 1;        for (int i = 0; i < K; i++)        {            int t = 0;            rec = maxn;            for (int j = maxn; j >= t; j--)            {                if (dp[j])                {                    for (int k = 1; k <= blocks[i].c; k++)                    {                        int a = k * blocks[i].h + j;                        if (a > blocks[i].a)                        {                            break;                        }                        if (rec < a)                        {                            rec = a;                        }                        dp[a] = 1;                    }                }            }            maxn = rec;        }        printf("%d\n", maxn);    }    return 0;}

这里写图片描述

0 0
原创粉丝点击