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;
    }
  • 相关阅读:
    5分钟快速入门angular2.0
    手把手教你书写对话框(构造函数&原型模式)
    JavaScript函数
    Javascript 循环
    javascript
    vue2.0 axios post请求传参问题(ajax请求)
    19.8.13第二天
    19.8.12 第一天的学习
    C#设计模式--简单工厂模式
    C#设计模式--单例模式
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7485110.html
Copyright © 2011-2022 走看看