码迷,mamicode.com
首页 > 其他好文 > 详细

洛谷 P1757 通天之分组背包 【分组背包】

时间:2018-05-16 15:24:14      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:这一   code   copy   AC   end   size   模板   new   bit   

题目链接:https://www.luogu.org/problemnew/show/P1757#sub

题目描述

自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

分组背包的模板题

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n, m;
    cin >> m >> n;
    int dp[1010]; 
    int w[105][1005], val[105][1005], ord[1005];
    int cur = 0; int a, b, c; int maxk = 0;
    for (int i = 1; i <=n; i++)
    {    
        cin >> a >> b >> c;
        maxk = max(maxk, c);          //记录下组数的最大值,方便循环的时候定义边界
        ord[c]++;                     //第c组的第几个物品  
        w[c][ord[c]] = a;             //第几组第几个物品的重量
        val[c][ord[c]] = b; 
    }
    for(int k=1;k<=maxk;k++)               //第k组
        for (int j = m; j >= 0; j--)       //背包容量
        {
            for (int i = 1; i <= ord[k]; i++)     //该组的物品序号
            {
                if(j>=w[k][i])     //由于j的范围是定义为>=0的,所以要记得加上这一条语句
                    dp[j] = max(dp[j], dp[j - w[k][i]] + val[k][i]);
            }
        }
    cout << dp[m] << endl;
    return 0;
}

 

 

2018-05-16

 

洛谷 P1757 通天之分组背包 【分组背包】

标签:这一   code   copy   AC   end   size   模板   new   bit   

原文地址:https://www.cnblogs.com/00isok/p/9045405.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!