您的位置:首页 > 其它

【模板】分组背包

2017-09-11 14:30 120 查看
哇竟然把动态规划写进了模板

基本介绍

模板题目

代码实现

基本介绍

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

模板题目

题目背景

直达通天路·小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)){
a51b
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: