题目描述

金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元钱就行”。今天一早,金明就开始做预算了,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:

主件 附件

电脑 打印机,扫描仪

书柜 图书

书桌 台灯,文具

工作椅 无

如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有00个、11个或22个附件。附件不再有从属于自己的附件。金明想买的东西很多,肯定会超过妈妈限定的NN元。于是,他把每件物品规定了一个重要度,分为55等:用整数1-51−5表示,第55等最重要。他还从因特网上查到了每件物品的价格(都是1010元的整数倍)。他希望在不超过NN元(可以等于NN元)的前提下,使每件物品的价格与重要度的乘积的总和最大。

设第jj件物品的价格为v_[j]v[​j],重要度为w_[j]w[​j],共选中了kk件物品,编号依次为j_1,j_2,…,j_kj1​,j2​,…,jk​,则所求的总和为:

v_[j_1] \times w_[j_1]+v_[j_2] \times w_[j_2]+ …+v_[j_k] \times w_[j_k]v[​j1​]×w[​j1​]+v[​j2​]×w[​j2​]+…+v[​jk​]×w[​jk​]。

请你帮助金明设计一个满足要求的购物单。

输入输出格式

输入格式:

第11行,为两个正整数,用一个空格隔开:

N mNm (其中N(<32000)N(<32000)表示总钱数,m(<60)m(<60)为希望购买物品的个数。) 从第22行到第m+1m+1行,第jj行给出了编号为j-1j−1的物品的基本数据,每行有33个非负整数

v p qvpq (其中vv表示该物品的价格(v<10000v<10000),p表示该物品的重要度(1-51−5),qq表示该物品是主件还是附件。如果q=0q=0,表示该物品为主件,如果q>0q>0,表示该物品为附件,qq是所属主件的编号)

输出格式:

一个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的最大值(<200000)。


/* 用一个鬼畜的方法写了出来,开森开森(/≧▽≦)/ */

首先将每一个主件用0/1背包处理,用f[j - v[i]] + p[i]来更新f[i],如果能够更新,就枚举这个主件的每一个附件f[j] + p[k]去更新f[j + v[k]](k为附件);如果只是这样的话,有一种主件会亏,但附件血赚的情况就没有考虑;所以先将这个主件不更新的值记录下来,假设这个主件被买,用附件去更新后面,最后再用这个记录的值去更新到底买不买主件;这段代码鬼畜的地方在于假设这个点被更新,被更新后还要更新已经被更新过的点,并且最后还要判断这个点需不需要更新;

#include <bits/stdc++.h>using namespace std;#define ll long long
#define INF 0x3f3f3f3f
#define MAXN 10100000
#define MAXM 3010
#define _ 0template < typename T > inline void read(T &x) {x = 0;T ff = 1, ch = getchar();while(!isdigit(ch)) {if(ch == '-') ff = -1;ch = getchar();}while(isdigit(ch)) {x = (x << 1) + (x << 3) + (ch ^ 48);ch = getchar();}x *= ff;
}int n,m,ans,f[MAXN],v[MAXN],p[MAXN],q[MAXN];
vector < int > a[70];int main() {read(n); read(m);for(int i = 1; i <= m; ++i) {read(v[i]);read(p[i]);read(q[i]);p[i] *= v[i];if(q[i] > 0) a[q[i]].push_back(i);}for(int i = 1; i <= m; ++i) {if(!q[i]) {for(int j = n; j >= v[i]; --j) {
//                if(f[j - v[i]] + p[i] > f[j]) {int maxx = f[j];f[j] = f[j - v[i]] + p[i];
//                }       for(int k = 0; k < a[i].size(); ++k) {if(j + v[a[i][k]] <= n && f[j + v[a[i][k]]] < f[j] + p[a[i][k]])f[j + v[a[i][k]]] = f[j] + p[a[i][k]];} if(a[i].size() == 2) {if(j + v[a[i][0]] + v[a[i][1]] <= n && f[j + v[a[i][1]] + v[a[i][0]]] < f[j] + p[a[i][0]] + p[a[i][1]])f[j + v[a[i][1]] + v[a[i][0]]] = f[j] + p[a[i][0]] + p[a[i][1]];}  /*if(f[j - v[i]] + p[i] > f[j]) {f[j] = f[j - v[i]] + p[i];    }  */        f[j] = max(f[j],maxx);                                                                                                 }}}for(int i = 1; i <= n; ++i) ans = max(ans,f[i]);printf("%d\n",ans);return (0^_^0);
}

转载于:https://www.cnblogs.com/AK-ls/p/10596712.html

NOIP 2006 T2 金明的预算方案相关推荐

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

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

  2. P1064 金明的预算方案

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

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

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

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

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

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

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

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

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

  7. 不止代码:洛谷P1064 金明的预算方案+P2014选课(依赖背包)

    文章目录 题目描述 总结 解析 解法1 解法2 代码 解法3 代码 题目描述 金明的预算方案 选课 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是, ...

  8. 背包形动态规划 fjutoj2375 金明的预算方案

    金明的预算方案 TimeLimit:1000MS  MemoryLimit:128MB 64-bit integer IO format:%lld Problem Description 金明今天很开 ...

  9. 信息学奥赛一本通 1844:【06NOIP提高组】金明的预算方案 | 洛谷 P1064 [NOIP2006 提高组] 金明的预算方案

    [题目链接] ybt 1844:[06NOIP提高组]金明的预算方案 洛谷 P1064 [NOIP2006 提高组] 金明的预算方案 [题目考点] 1. 动态规划:分组背包 2. 动态规划:依赖背包 ...

最新文章

  1. JavaScript改变 HTML 内容
  2. 德国阿尔迪成功启示录(转载)
  3. vs增量链接、清单文件
  4. Proactor设计模式
  5. mysql slow time_mysql使用slow log
  6. 设计模式整理之简单工厂
  7. 计数排序vs基数排序vs桶排序
  8. rlwrap解决sqlplus上下键和backspace键找历史命令
  9. PyTorch 多目标跟踪
  10. 极递云课显示服务器连接超时,服务器连接问题
  11. WindowsServer2012 DFS配置出错原因
  12. 使用组合改进软件测试用例的生成2
  13. CI框架源码学习笔记7——Utf8.php
  14. H5商城与小程序商城哪个好_应该怎么选择_OctShop
  15. 博弈论分析题_“博弈论”习题和参考答案与解析
  16. 加速Web开发的9款知名HTML5框架
  17. 通过金矿模型介绍动态规划(转)
  18. 【Vue】Emitted value instead of an instance of Error
  19. 送你4句口诀 云存储选型不再犯难
  20. Kibana数据表格

热门文章

  1. 控制台程序console输入参数 获取参数
  2. 【转】Spring Bean单例与线程安全
  3. 如何创建一个基本JQuery的插件
  4. android studio- java注释自己动手弄起来
  5. BZOJ 1798: [Ahoi2009]Seq 维护序列seq
  6. Mac os下安装brew
  7. AMIO编辑器开发(三):转向C++,月底遇到第二个瓶颈
  8. cadence 添加自己设计的pad方法
  9. php curl 句柄 复用,PHP-curl multi批处理CPU负载过高的解决办法
  10. 图解ARP协议(六)RARP与IARP:被遗忘的兄弟协议