题目背景

直达通天路·小 A 历险记第二篇

题目描述

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

输入格式

两个数 m,nm,n,表示一共有 nn 件物品,总重量为 mm。

接下来 nn 行,每行 33 个数 ai,bi,ciai​,bi​,ci​,表示物品的重量,利用价值,所属组数。

输出格式

一个数,最大的利用价值。

输入输出样例

输入 #1复制

45 3
10 10 1
10 5 1
50 400 2

输出 #1复制

10

说明/提示

1≤m,n≤10001≤m,n≤1000。

两种写法:

一种是每次先考虑将一个背包计算完,另一个是先考虑将一个物品考虑完

写法1:

从最大的背包容量开始倒着往前,每次尝试所有物品,每次一个背包计算完成后,比如dp[43]结束后,再去计算dp[42],当计算dp[42]的时候,我们已经无需考虑dp[43]了。这样倒着往前,直到计算完所有容量的背包。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#define INF 0x3f3f3f3f
#define NUM 100using namespace std;int main()
{int m,n;int g = 0;int dp[1001];memset(dp, 0, sizeof(dp));vector<int> v[NUM];vector<int> w[NUM];scanf("%d%d", &m, &n);for(int i=0; i<n; i++) {int a,b,c;scanf("%d%d%d", &a, &b, &c);w[c].push_back(a);v[c].push_back(b);g = max(g, c);}for(int i=0; i<=g; i++) {for(int j=m; j>=0; j--) {for(int k=0; k<w[i].size(); k++) {if(j >= w[i][k])dp[j] = max(dp[j], dp[j-w[i][k]] + v[i][k]);}}}printf("%d\n", dp[m]);return 0;
}

写法2:

我们用temp数组记录上一组数据dp结束后的dp值,然后我们先考虑其中一个物品,将该物品放到所有的背包里面(还是倒着放),计算得出放当前物品后的dp值。当放下一个物品时,我们比较的是当前的dp与temp,因为temp自始至终没有改变过,所以我们这次比较的结果其实是最初的dp数组选择当前物品得到的dp与上一次选择物品后得到的dp值的比较。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#define INF 0x3f3f3f3f
#define NUM 100using namespace std;int main()
{int m,n;int g = 0;int dp[1001];int temp[1001];memset(dp, 0, sizeof(dp));vector<int> v[NUM];vector<int> w[NUM];scanf("%d%d", &m, &n);for(int i=0; i<n; i++) {int a,b,c;scanf("%d%d%d", &a, &b, &c);w[c].push_back(a);v[c].push_back(b);g = max(g, c);}for(int i=0; i<=g; i++) {for(int j=0; j<=m; j++)temp[j] = dp[j];for(int k=0; k<w[i].size(); k++) {for(int j=m; j>=w[i][k]; j--) {dp[j] = max(dp[j], temp[j-w[i][k]]+v[i][k]);}}}printf("%d\n", dp[m]);return 0;
}

luogu 1757 分组背包相关推荐

  1. 【题解】luogu P1757 通天之分组背包

    分组背包类型 总结: 1.先循环体积,再循环每组内的物品,保证每组物品内只选一次. 若调换位置,有可能每组内物品多选了. 2.num数组记录每组有多少个物品: belong数组记录每组物品的每一个物品 ...

  2. P1064 金明的预算方案(分组背包)

    https://www.luogu.org/problemnew/show/P1064 题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈 ...

  3. 【背包DP练习】洛谷 P5020货币系统 P1757通天之分组背包 P1064[NOIP2006 提高组]金明的预算方案 P5322 [BJOI2019]排兵布阵

    洛谷 P5020货币系统 https://www.luogu.com.cn/problem/P5020 思路是把货币从小到大排序,然后按顺序依次完全背包dp,每次dp检查i-1种面值的货币能不能凑出第 ...

  4. 洛谷 p1757 通天之分组背包(哈希,分组背包)2021-08-12

    题目背景 直达通天路·小 A 历险记第二篇 题目描述 自 01 背包问世之后,小 A 对此深感兴趣.一天,小 A 去远游,却发现他的背包不同于 01 背包,他的物品大致可分为 k 组,每组中的物品相互 ...

  5. Java 解洛谷PP5322 [BJOI2019] 排兵布阵,包含完整的分组背包状态转移方法说明,通俗易懂

    01.题目及链接 题目链接:https://www.luogu.com.cn/problem/P5322 02.分组背包说明 分组背包:有k组物品,N个物品,一个容量是C的背包.每组物品有若干个,同一 ...

  6. 分组背包----HDU1712 ACboy needs your help

    很简单的一道分组背包入门问题.不多解释了. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring&g ...

  7. [bzoj1025][SCOI2009]游戏 (分组背包)

    Description windy学会了一种游戏.对于1到N这N个数字,都有唯一 且不同的1到N的数字与之对应.最开始windy把数字按顺序1,2,3,--,N写一排在纸上.然后再在这一排下面写上它们 ...

  8. HDU 3033 I love sneakers! (分组背包变形)

    题目大意:xx去买鞋,有k种牌子,然后给出n双鞋,每双鞋有它属于的牌子.价格.收藏价值.xx认为他不差钱,要求每种鞋子买一双.但实际上他只有m毛钱,问能否买到符合xx要求的鞋,能找到的话输出最大的收藏 ...

  9. hdu 1712(分组背包)

    题意:有N个课程,然后选择M天内学习的效益最大值,注意每个课程最多选取一次. 解题思路:裸的分组背包,把每门课程看做是每一组,每一组里面最多选择一个天数,典型的分组背包.详见背包九讲 #include ...

最新文章

  1. python slice是共享内存吗_在共享内存中使用numpy数组进行多处理
  2. 力扣(LeetCode)刷题,简单+中等题(第28期)
  3. c语言将ascii码存入eeprom,微机原理复习题答案+_Fixed
  4. 【原创】项目管理得失经验总结
  5. post基础-百度翻译接口测试
  6. [技术博客] gitlab快速部署流程
  7. 左神算法:复制含有随机指针节点的链表 / 复杂链表的复制(Java版本)
  8. [蓝桥杯][算法提高VIP]贪吃的大嘴(多重背包)
  9. 电脑显示连接了网络但是不能上网_为什么电脑插上网线显示已连接却上不了网...
  10. 如何快速学好python语言_如何快速的学习Python语言
  11. 超级计算机应用领域的概括,超级计算机进展的相关研究
  12. 数据库名、实例名、数据库域名、全局数据库名、服务名 我也迷糊了
  13. linux apache tomcat php 共用 80,apache与tomcat共用80端口
  14. 【笔试/面试】—— 奇葩 C/C++ 语法题(二)
  15. python下载哪个版本好-python下载哪个版本好
  16. 【Flutter】flutter doctor 报错Android license status unknown. Run `flutter doctor --android-licenses‘
  17. Android开发程序获取GPS信息步骤
  18. 做公文流转的具体思路
  19. 9.2 博客和OJ——让代码积累看得见——《逆袭大学》连载
  20. 计算机或信息化的专业职称,信息系统项目管理师是高级职称吗?

热门文章

  1. 阿里云——云数据库RDS
  2. 2020及2021年常被利用的30个软件漏洞
  3. 基于vue2 + Muse-ui 开发的移动端轻社区项目 F-Rent
  4. 笔记本电脑电流声(滋啦滋啦声)解决方案
  5. 计算机重启很慢,教您win7电脑关机很慢的解决方法
  6. 通过LNK文件(快捷方式)解析出目标文件的路径
  7. (二)验证码模块(随机英文验证and随机英文数字混合验证+Session)
  8. Window10 和 Ubuntu20.04 双系统安装
  9. 美团王兴,为什么让骑手注册个体户?详解他的套路,望周知
  10. linux批处理创建mysql用户_域用户和组帐户的管理之一次同时添加多个用户帐户篇...