NOIP 2006 金明的预算方案 (裸?)分组背包
或许还有其他方式,不过我就是按分组背包写的,几近裸题。
我也是纳闷,前两天刚刚做过一道分组背包的题,理解了分组背包的正确打开方式,今天却差点没想出来。真是。。。该去睡一会。
对于每个物品以及它的附件,我们把它们拆开,使它们成为独立的物品。因为每个物品最多有两个附件,所以最多会拆成4个新的物品:原主件,原主件+附件1,原主件+附件2,原主件+附件1+附件2,这样一来就没有依赖关系。但是,对于每个物品以及它的附件拆成的4个独立的物品,虽说所有的这样的物品时等价的,但是每4个这样的物品是不可以同时选的。这就是分组背包的模型。
如何避免同一组内的物品被选多个?只需要保证每一个状态不由同一组的转移即可。想一想0-1背包的模型,有两层循环,第一层枚举物品i,第二层枚举背包容量j,如果把两层颠倒,那么结果会变成什么?会导致答案仅仅为所有物品中价值最大的那一个。因为我们是对于容量j枚举物品i,f[j-v[i]]还没有被计算过,或者说,还没有被这一组内的物品计算过,而我们对于0-1背包把两层循环颠倒就相当于把所有物品分成了一组,这一组内只能选一个。
所以,再写一遍,分组背包的解决方式就是,在每个容量下枚举一组内的所有物品,保证同一组内不会有状态的互相转移。在容量之上枚举每一组。
#include <cstdio>
#include <algorithm>
#include <cstring>
#define w0 g[i].pri*g[i].imp
#define v0 g[i].pri
#define w1 g[g[i].c1].pri*g[g[i].c1].imp
#define v1 g[g[i].c1].pri
#define w2 g[g[i].c2].pri*g[g[i].c2].imp
#define v2 g[g[i].c2].pri
using namespace std;int n, m, e, w[245], v[245];
int f[32005]; struct goods{int pri, imp;int q, c1, c2;
}g[66];int main()
{scanf("%d %d", &n, &m);for(int i = 1; i <= m; i++){scanf("%d %d %d", &g[i].pri, &g[i].imp, &g[i].q);g[g[i].q].c2 = g[g[i].q].c1;g[g[i].q].c1 = i;}for(int i = 1; i <= m; i++){if(g[i].q) continue;w[++e] = w0;v[e] = v0;w[++e] = w0 + w1;v[e] = v0 + v1;w[++e] = w0 + w2;v[e] = v0 + v2;w[++e] = w0 + w1 + w2;v[e] = v0 + v1 + v2;}for(int i = 1; i <= e; i += 4)for(int j = n; j >= 0; j--)for(int k = 0; k < 4; k++){if(j-v[i+k] < 0) continue;f[j] = max(f[j], f[j-v[i+k]] + w[i+k]);}printf("%d", f[n]);return 0;
}
NOIP 2006 金明的预算方案 (裸?)分组背包相关推荐
- 【每日DP】day7P1064 金明的预算方案 (分组背包,我又悟了)难度⭐⭐★
P1064 金明的预算方案 背包其实就是把一个大问题拆分成若干个子问题,把一个要拿东西的动作按照题目要求分成若干个动作,分别枚举(DP其实就是非常的暴力),比较取最大值. 比如这道题,背包的物品之间是 ...
- 金明的预算方案(分组背包)
T2 金明的预算方案 http://www.tyvj.cn/p/1057 背景 NOIP2006 提高组 第二道 描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房 ...
- P1064 金明的预算方案(分组背包)
https://www.luogu.org/problemnew/show/P1064 题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈 ...
- 487 金明的预算方案(分组背包问题扩展)
1. 问题描述: 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超 ...
- 金明的预算方案(01背包)
题目: 点击跳转 输入: 1000 5 800 2 0 400 5 1 300 5 1 400 3 0 500 2 0 输出: 2200 解题: 初看这道题,数据就 m<60, 感觉dfs就能直 ...
- P1064 金明的预算方案
P1064 金明的预算方案 题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置 ...
- bsoj 1512 金明的预算方案(树型DP)
[NOIP 2006提高]金明的预算方案 Time Limit:10000MS Memory Limit:65536K Total Submit:485 Accepted:222 Case T ...
- [LuoguP1064][Noip2006]金明的预算方案
金明的预算方案(Link) 题目描述 现在有\(M\)个物品,每一个物品有一个钱数和重要度,并且有一个\(Q\),如果\(Q = 0\),那么该物件可以单独购买,当\(Q != 0\)时,表示若要购买 ...
- P1064 [NOIP2006 提高组] 金明的预算方案
P1064 [NOIP2006 提高组] 金明的预算方案 题意: 每个物品有价格和价值,物品之间存在依赖关系(单向的),现在又n元钱,买哪些物品,即满足依赖关系又使得每件物品的价格与价值的乘积的总和最 ...
最新文章
- 关于Block的copy和循环引用的问题
- Java集合干货——ArrayList源码分析
- oracle中decode函数用法及应用
- python treeview文本自动换行显示_在tkinter.ttk.Treeview列中设置文本格式
- 字体在ppt中可以整体替换吗_如何给ppt整体改字体_教你给ppt整体改字体的方法-系统城...
- MySQL表/视图/存储过程and函数/触发器/事件与数据库之间的关系
- 物联网可能面临灾难性安全风险
- 图标插件java_java – Eclipse插件:标记的自定义图标
- jQuery验证码发送时间秒递减(刷新存储cookie)
- java虚拟机进程_Java虚拟机详解(七)------虚拟机监控和分析工具(1)——命令行...
- python批量读取图片并复制入word_提取word文档中的图片并使用Python进行批量格式转换,出,Word,里,利用,python...
- 出发啦,不要问那路在哪
- 第一次没有写出来的SQL
- LayaAr 批量加载资源 LoaderManager
- c51单片机编程实例c语言,C51单片机C语言编程基础和实例
- 电路里的希腊字母读音
- 【Bug】ValueError: Solver lbfgs supports only ‘l2‘ or ‘none‘ penalties, got l1 penalty
- java百度上传控件_百度Bos上传文件工具类-BosUtils(java)
- 微信小程序之快递查询(完整版)
- 【LeetCode - 277】搜寻名人