zoukankan      html  css  js  c++  java
  • 洛谷P1757 通天之分组背包

    题目背景

    直达通天路·小A历险记第二篇

    题目描述

    自01背包问世之后,小A对此深感兴趣。一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少。

    输入输出格式

    输入格式:

    两个数m,n,表示一共有n件物品,总重量为m

    接下来n行,每行3个数ai,bi,ci,表示物品的重量,利用价值,所属组数

    输出格式:

    一个数,最大的利用价值

    输入输出样例

    输入样例#1:
    45 3
    10 10 1
    10 5 1
    50 400 2
    输出样例#1:
    10

    说明

    1<=m<=1000 1<=n<=1000 组数t<=100

    分析:分组背包裸题,和0/1背包差不多,0/1背包每个物品只能选一个,分组背包每一组只能选一个,那么状态记录前i组而不是前i个就好了,然后枚举看第i组装哪一个.需要注意的是v一定要在k前面枚举,否则可能就不满足分组背包的条件了.(似乎如果我不用滚动数组就很容易写错......)

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <cmath>
    
    using namespace std;
    
    int n,m,a[1010],b[1010],c[110][1010],maxn;
    int f[1010];
    
    int main()
    {
        scanf("%d%d",&m,&n);
        for (int i = 1; i <= n; i++)
        {
            int t;
            scanf("%d%d%d",&a[i],&b[i],&t);
            maxn = max(maxn,t);
            c[t][++c[t][0]] = i;
        }
        for (int i = 1; i <= maxn; i++)
        for (int j = m; j >= 0; j--)
        for (int k = 1; k <= c[i][0]; k++)
        if (j - a[c[i][k]] >= 0)
        f[j] = max(f[j],f[j - a[c[i][k]]] + b[c[i][k]]);
        printf("%d
    ",f[m]);
        return 0;
    }
  • 相关阅读:
    Navicat for Mysql安装及破解教程
    如何down掉IB交换机口
    pycharm替换文件中所有相同字段方法
    NAS、SAN、ISCSI存储
    Linux系统下安装rz/sz命令及使用说明
    python 实现查找某个字符在字符串中出现次数,并以字典形式输出
    python class用法
    zookeeper
    机器学习基础
    hive--数据仓库
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7485110.html
Copyright © 2011-2022 走看看