【Poj2392 Space Elevator】多重背包

来源:互联网 发布:mysql导入excel文件 编辑:程序博客网 时间:2024/05/16 23:58
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAXN = 400000 + 5;struct Block {    int h, a, c;}B[400 + 5];bool cmp (Block a, Block b){    return a.a < b.a;}int sum[MAXN];bool f[MAXN]; //这个位置有没有被访问过int main(){    int K;    scanf("%d", &K);    for (int i = 0; i < K; i++)    {        scanf("%d %d %d", &B[i].h, &B[i].a, &B[i].c);    }    sort(B, B + K, cmp);    memset(f, false, sizeof(f));    f[0] = true;    int ans = 0;    for (int i = 0; i < K; i++)    {        memset(sum, 0, sizeof(sum));        for (int j = B[i].h; j <= B[i].a; j++)        {            if (f[j] == false && f[j - B[i].h] != false && sum[j - B[i].h] < B[i].c)            {                f[j] = true;                sum[j] = sum[j - B[i].h] + 1;//统计这种石块放置的个数                if (ans < j) ans = j;            }        }    }    printf("%d\n", ans);    return 0;}

代码是从这里抄的,稍微改了一点。
首先排序。因为要排序,所以把石块用一个结构体存了。
输出的最大高度也不会超过石块的可以放置的最大的高度的MAX值,所以j中必然会有答案。

我。。。这个是多重背包。。。但是它的实现让我比较懵逼,和我看的不是一样的啊。如果是我自己写还是写不出来qnq

0 0