华师一附中OI组
标题:
P1757 通天之分组背包
[打印本页]
作者:
admin
时间:
2018-6-3 21:51
标题:
P1757 通天之分组背包
https://www.luogu.org/problemnew/show/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
作者:
胡雨菲菲
时间:
2018-6-5 18:01
#include <cstdio>
#include <algorithm>
typedef long long LL;
using namespace std;
const int N = 1010;
const LL INF = 1ll << 62;
struct A {
LL cost, val, group;
bool operator < (const A &x) {
return group < x.group;
}
}a[N];
struct Group {
LL s, t, small;
}g[N];
LL f[N];
int main() {
LL V, n;
scanf("%lld%lld", &V, &n);
for(int i = 1; i <= n; i++) {
scanf("%lld%lld%lld", &a[i].cost, &a[i].val, &a[i].group);
}
sort(a + 1, a + n + 1);
for(int i = 1; i <= n; i++) {
if(a[i].group != a[i - 1].group) {
g[a[i].group].s = i;
}
g[a[i].group].t = i;
}
for(int i = 1; i <= a[n].group; i++) {
g[i].small = INF;
for(int j = g[i].s; j <= g[i].t; j++) {
g[i].small = min(g[i].small, a[j].cost);
}
}
for(int k = 1; k <= a[n].group; k++) { /// k-th group
for(int i = V; i >= g[k].small; i--) { /// i V
for(int j = g[k].s; j <= g[k].t; j++) { /// j which
if(i >= a[j].cost) {
f[i] = max(f[i], f[i - a[j].cost] + a[j].val);
}
}
}
}
LL ans = 0;
for(int i = 1; i <= V; i++) {
ans = max(ans, f[i]);
}
printf("%lld", ans);
return 0;
}
复制代码
作者:
吴语林
时间:
2018-7-30 00:08
#include <algorithm>
#include <iostream>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstdlib>
using namespace std;
vector <int> v[1100],w[1100];
int f[1100],m,n,T=0;
int main()
{
scanf("%d%d",&m,&n);
for(int i=1;i<=n;i++)
{
int v1,w1,a1;
scanf("%d%d%d",&w1,&v1,&a1);
v[a1].push_back(v1);
w[a1].push_back(w1);
T=max(T,a1);
}
for(int i=1;i<=T;i++)
for(int j=m;j>=0;j--)
for(int k=0;k<v[i].size();k++)
if(j>=w[i][k])
f[j]=max(f[j],f[j-w[i][k]]+v[i][k]);
printf("%d",f[m]);
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2