【模板】分组背包

来源:互联网 发布:最新小说网盘搜索 知乎 编辑:程序博客网 时间:2024/06/03 22:21

哇竟然把动态规划写进了模板

  • 基本介绍
  • 模板题目
  • 代码实现

基本介绍

分组背包 就是物品带组别的 一个组的不能重复选之类的

模板题目

题目背景
直达通天路·小A历险记第二篇

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

输入输出格式
输入格式:
两个数m,n,表示一共有n件物品,总重量为m
接下来n行,每行3个数ai,bi,ci,表示物品的重量,利用价值,所属组数
输出格式:
一个数,最大的利用价值

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

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

代码实现

#include<iostream>#include<cstdio>#include<cctype>    using namespace std;    #define in = read()    typedef long long ll;    const ll size = 1000 + 10;        ll n,m;        ll a[size],b[size],c[size][size];        ll cc,tm;        ll f[size];inline ll read(){        ll num = 0 , f = 1;   char ch = getchar();        while(!isdigit(ch)){                if(ch == '-')   f = -1;                ch = getchar();        }        while(isdigit(ch)){                num = num*10 + ch - '0';                ch = getchar();        }        return num*f;}int main(){        m in;   n in;        for(ll i=1;i<=n;i++){                a[i] in;    b[i] in;    cc in;                c[cc][++c[cc][0]] = i;                tm = max(tm,cc);        }        for(ll i=1;i<=tm;i++)                for(ll j=m;j>0;j--)                        for(int k=1;k<=c[i][0];k++)                                if(j >= a[c[i][k]])                                        f[j] = max(f[j],f[j - a[c[i][k]]] + b[c[i][k]]);        printf("%d",f[m]);}//COYG
原创粉丝点击