JDOJ-2451: 分组

[文章目录]

Description

一个旅行者有一个最多能用V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。


分组背包,借用上一组DP值就可以了(技巧: 二维数组,0^1=1,1^1=0)

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int n,v,t;
int f[210][2];
struct node
{
    int w[40],val[40];
    int size;
}id[20];

int main()
{
    scanf("%d%d%d",&v,&n,&t);
    for(int x,y,z,i=1;i<=n;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        int t=++id[z].size;
        id[z].w[t]=x;
        id[z].val[t]=y;
    }
    int c=1;
    for(int i=1;i<=t;i++)
    {
        for(int j=1;j<=id[i].size;j++)
        {
            int ww=id[i].w[j],vv=id[i].val[j];
            for(int k=v;k>=ww;k--)
            {
                f[k][c]=max(f[k][c],f[k-ww][c^1]+vv);
            }
        }
        for(int i=v;i>0;i--)
            f[i][c]=max(f[i][c],f[i][c^1]);
        c=c^1;
    }
    printf("%d",f[v][c^1]);
    return 0;
}

 

发表评论

邮箱地址不会被公开。 必填项已用*标注