题目背景
直达通天路·小 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,n≤1000。
这个题目不单只是个套分组背包板子的题目,我认为它还结合了hash的思想
题目中并没有说明有多少组物品,这点需要分析
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 1000; int w[N+10][N+10]; int v[N+10][N+10]; int dp[N+10]; int n,m; int _hash[N+10]; int main() { cin>>m>>n; int wei,val,grp;//重量,价值,组别 int tmp=-1; for(int i=1;i<=n;i++) { cin>>wei>>val>>grp; _hash[grp]++;//第grp组物品的个数 w[grp][_hash[grp]]=wei;//第grp组物品中的第_hash[grp]个物品的重量 v[grp][_hash[grp]]=val; tmp=max(tmp,grp);//最大组别编号 } for(int i=1;i<=tmp;i++)//将最大组别编号tmp视作物品的组别数 for(int j=m;j>=0;j--)//倒序遍历重量 for(int k=1;k<=_hash[i];k++)//循环判断选or不选第i组物品中的第k个物品 if(j>=w[i][k]) dp[j]=max(dp[j], dp[j-w[i][k]]+v[i][k]); cout<<dp[m]<<endl; return 0; }
有位博主用vector容器来做,我觉得这样做还挺巧妙的,放在这里学习学习:洛谷1757(分组背包)
最后
以上就是清秀哑铃最近收集整理的关于洛谷 p1757 通天之分组背包(哈希,分组背包)2021-08-12的全部内容,更多相关洛谷内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复