或许还有其他方式,不过我就是按分组背包写的,几近裸题。
我也是纳闷,前两天刚刚做过一道分组背包的题,理解了分组背包的正确打开方式,今天却差点没想出来。真是。。。该去睡一会。

对于每个物品以及它的附件,我们把它们拆开,使它们成为独立的物品。因为每个物品最多有两个附件,所以最多会拆成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 金明的预算方案 (裸?)分组背包相关推荐

  1. 【每日DP】day7P1064 金明的预算方案 (分组背包,我又悟了)难度⭐⭐★

    P1064 金明的预算方案 背包其实就是把一个大问题拆分成若干个子问题,把一个要拿东西的动作按照题目要求分成若干个动作,分别枚举(DP其实就是非常的暴力),比较取最大值. 比如这道题,背包的物品之间是 ...

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

    T2 金明的预算方案 http://www.tyvj.cn/p/1057 背景 NOIP2006 提高组 第二道 描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房 ...

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

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

  4. 487 金明的预算方案(分组背包问题扩展)

    1. 问题描述: 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超 ...

  5. 金明的预算方案(01背包)

    题目: 点击跳转 输入: 1000 5 800 2 0 400 5 1 300 5 1 400 3 0 500 2 0 输出: 2200 解题: 初看这道题,数据就 m<60, 感觉dfs就能直 ...

  6. P1064 金明的预算方案

    P1064 金明的预算方案 题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置 ...

  7. bsoj 1512 金明的预算方案(树型DP)

    [NOIP 2006提高]金明的预算方案   Time Limit:10000MS  Memory Limit:65536K Total Submit:485 Accepted:222  Case T ...

  8. [LuoguP1064][Noip2006]金明的预算方案

    金明的预算方案(Link) 题目描述 现在有\(M\)个物品,每一个物品有一个钱数和重要度,并且有一个\(Q\),如果\(Q = 0\),那么该物件可以单独购买,当\(Q != 0\)时,表示若要购买 ...

  9. P1064 [NOIP2006 提高组] 金明的预算方案

    P1064 [NOIP2006 提高组] 金明的预算方案 题意: 每个物品有价格和价值,物品之间存在依赖关系(单向的),现在又n元钱,买哪些物品,即满足依赖关系又使得每件物品的价格与价值的乘积的总和最 ...

最新文章

  1. 关于Block的copy和循环引用的问题
  2. Java集合干货——ArrayList源码分析
  3. oracle中decode函数用法及应用
  4. python treeview文本自动换行显示_在tkinter.ttk.Treeview列中设置文本格式
  5. 字体在ppt中可以整体替换吗_如何给ppt整体改字体_教你给ppt整体改字体的方法-系统城...
  6. MySQL表/视图/存储过程and函数/触发器/事件与数据库之间的关系
  7. 物联网可能面临灾难性安全风险
  8. 图标插件java_java – Eclipse插件:标记的自定义图标
  9. jQuery验证码发送时间秒递减(刷新存储cookie)
  10. java虚拟机进程_Java虚拟机详解(七)------虚拟机监控和分析工具(1)——命令行...
  11. python批量读取图片并复制入word_提取word文档中的图片并使用Python进行批量格式转换,出,Word,里,利用,python...
  12. 出发啦,不要问那路在哪
  13. 第一次没有写出来的SQL
  14. LayaAr 批量加载资源 LoaderManager
  15. c51单片机编程实例c语言,C51单片机C语言编程基础和实例
  16. 电路里的希腊字母读音
  17. 【Bug】ValueError: Solver lbfgs supports only ‘l2‘ or ‘none‘ penalties, got l1 penalty
  18. java百度上传控件_百度Bos上传文件工具类-BosUtils(java)
  19. 微信小程序之快递查询(完整版)
  20. 【LeetCode - 277】搜寻名人

热门文章

  1. 超详细的遗传算法(Genetic Algorithm)解析【转】
  2. 记录安卓,IOS安装kali的办法
  3. 怎么自己建网站?自己建网站要注意以下4点
  4. 【codeforces 707C】Pythagorean Triples
  5. CDN流量是什么,怎么计算?
  6. 高效解决Tomcat控制台以及浏览器打开txt文件乱码问题
  7. 大量STATSPACK数据统计分析
  8. G - Tiling
  9. 轻微课靠不靠谱,我的60天体验可以说说
  10. disallow: /api.php,dz论坛如何禁止搜索引擎抓取任何内容?