华师一附中OI组
标题:
P1757 通天之分组背包
[打印本页]
作者:
admin
时间:
2018-6-29 18:32
标题:
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
作者:
walk_alone
时间:
2018-7-29 08:53
#include <cstdio>
#include <algorithm>
using namespace std;
int thing[101][1001],a[1001],b[1001],cnt[101],f[1001];
int main()
{
int n,m,c,maximum=-999;
scanf("%d%d",&m,&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&a[i],&b[i],&c);
thing[c][++cnt[c]]=i;
maximum=max(maximum,c);
}
for(int k=1;k<=maximum;k++)
for(int v=m;v>=0;v--)
for(int i=1;i<=cnt[k];i++)
if(v>=a[thing[k][i]])
f[v]=max(f[v],f[v-a[thing[k][i]]]+b[thing[k][i]]);
printf("%d",f[m]);
return 0;
}
复制代码
作者:
张笑宇
时间:
2018-7-29 17:09
#include<iostream>
using namespace std;
int n,sumv;
const int mx=1010;
int v[mx],w[mx],t[mx];
int dp[mx],i,j,k;
int sumc,c[110][110],countc[110];///sumc总组数
int main()///countc[i]第i组个数
{
cin>>sumv>>n;
for (i=1; i<=n; i++)
{
cin>>v[i]>>w[i]>>t[i];
sumc=max(sumc,t[i]);
countc[t[i]]++;
c[t[i]][countc[t[i]]]=i;
}
for (i=1; i<=sumc; i++)///枚举组数
for (j=sumv; j>=0; j--)
for (k=1; k<=countc[i]; k++)
if (j>=v[c[i][k]])
dp[j]=max(dp[j],dp[j-v[c[i][k]]]+w[c[i][k]]);
cout<<dp[sumv];
return 0;
}
复制代码
作者:
张笑宇
时间:
2018-7-29 17:10
分组背包+跳转表
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2