【原题】
Time Limit: 1sec    Memory Limit:32MB
Description

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

主件

附件

电脑

打印机,扫描仪

书柜

图书

书桌

台灯,文具

工作椅

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

设第j件物品的价格为v[j],重要度为w[j],共选中了k件物品,编号依次为j1,j2,……,jk,则所求的总和为:

v[j1]*w[j1]+v[j2]*w[j2]+ …+v[jk]*w[jk]。(其中*为乘号)

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

Input

输入包含多个测试数据。

每个测试数据的第1行,为两个正整数,用一个空格隔开:

N  m

(其中N(<32000)表示总钱数,m(<60)为希望购买物品的个数。)

从第2行到第m+1行,第j行给出了编号为j-1的物品的基本数据,每行有3个非负整数

v  p  q

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

Output
对于每个测试数据,输出一个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的最大值(<200000)。
Sample Input
 Copy sample input to clipboard
1000 5
800 2 0
400 5 1
300 5 1
400 3 0
500 2 0
1000 5
800 2 0
400 5 1
300 5 1
400 3 0
500 2 0

Sample Output
2200 2200
【思路】
有依赖的背包问题,我的代码只是针对附件个数为2的情况,不具扩展性,更一般的情况应该是可以处理附件个数比较多的情况,不过看了别人的代码理解不了,看来还没到那个level。就先用这种过了再说吧。
我的解法是,既然附件个数不会超过两个,那么只有4种情况:主件、主件+附件1、主件+附件2、主件+附件1+附件2,把这四种情况都求出来,就变成分组背包问题,即每个组里面有4个物品(如果该主件没有附件或只有一个附件,那么这四种情况中有些不存在就记为0),然后就用分组背包的处理方法求解。

 1 // Problem#: 1346
 2 // Submission#: 1457193
 3 // The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
 4 // URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
 5 // All Copyright reserved by Informatic Lab of Sun Yat-sen University
 6 #include<iostream>
 7 #include<memory.h>
 8 using namespace std;
 9 int main()
10 {
11     int n,m;
12     while(cin>>n>>m)
13     {
14             int vv[61],pp[61],qq[61];
15             memset(vv,0,sizeof(vv));
16             memset(pp,0,sizeof(pp));
17             memset(qq,0,sizeof(qq));
18
19
20             int p[61][4],v[61][4];
21             int a[61][2];         //一个主件最多有两个附件,没有的话就记为0
22             memset(v,0,sizeof(v));
23             memset(p,0,sizeof(p));
24             memset(a,0,sizeof(a));
25
26             for(int i=1;i<=m;i++)
27             {
28                cin>>vv[i]>>pp[i]>>qq[i];
29                if(qq[i])             //标记附件
30                {
31                         if(!a[qq[i]][0])
32                         a[qq[i]][0] = i;
33                         else
34                         a[qq[i]][1] = i;
35                }
36             }
37             int f[61][4];     //存放每种情况的价值v*p;
38             memset(f,0,sizeof(0));
39             for(int i=1;i<=m;i++)     //变成分组背包
40             {
41                 if(!qq[i])
42                 {
43                   f[i][0] = vv[i] * pp[i];
44                   f[i][1] = vv[ a[i][0] ]*pp[ a[i][0] ] + vv[i] * pp[i];
45                   f[i][2] = vv[ a[i][1] ]*pp[ a[i][1] ] + vv[i] * pp[i];
46                   f[i][3] = vv[ a[i][0] ]*pp[ a[i][0] ] + vv[ a[i][1] ]*pp[ a[i][1] ] + vv[i] * pp[i];
47
48                   v[i][0] = vv[i];
49                   v[i][1] = vv[ a[i][0] ] + vv[i];
50                   v[i][2] = vv[ a[i][1] ] + vv[i];
51                   v[i][3] = vv[ a[i][0] ] + vv[ a[i][1] ] + vv[i];
52                 }
53             }
54
55
56             int dp[n+1];
57             memset(dp,0,sizeof(dp));
58             for(int i=1;i<=m;i++)       //分组背包
59             {
60               if(!qq[i])
61                   for(int j=n;j>=0;j--)
62                      for(int k=0;k<4;k++)
63                      {
64                              if(j-v[i][k]>=0)
65                              dp[j]=max(dp[j],dp[j-v[i][k]] + f[i][k]);
66                      }
67             }
68             cout<<dp[n]<<endl;
69     }
70     return 0;
71 }                                 

转载于:https://www.cnblogs.com/mrlaker/archive/2012/07/17/2595345.html

Sicily 1346. 金明的预算方案相关推荐

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

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

  2. P1064 金明的预算方案

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

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

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

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

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

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

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

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

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

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

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

  8. 1064金明的预算方案

    金明的预算方案 题目传送门https://www.luogu.org/problemnew/show/P1064 给你们一组数据 2000 10 500 1 0 400 4 0 300 5 1 400 ...

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

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

最新文章

  1. eclipse alt+/快捷键失效
  2. 解决linux下无线网卡被物理禁用问题
  3. Count on a tree
  4. 【youcans 的 OpenCV 例程 200 篇】112. 滤波反投影重建图像
  5. Fiddler 抓包(一)—iOS
  6. 墨刀和axure使用经验分享
  7. paypal支付接口开发-Golang版
  8. 信息学竞赛报名指南(NOI)
  9. 运筹学4个人完成三项工作_【用人话讲运筹学】十一、指派问题
  10. html怎么制作小黄人,教你如何自己动手制作小黄人模型攻略
  11. P2504 [HAOI2006]聪明的猴子-题目详解
  12. Python的excel工作簿写入与读取操作
  13. 语c语言描写,语c动作描写
  14. 有了繁难字库生僻字不用造(一)
  15. 公众号服务器配置如何不显示,公众号服务器配置信息怎么设置
  16. 推荐一个不到2MB的C#开发工具箱,集成了上千个常用操作类
  17. 汇编:shl, shr 逻辑移动指令
  18. WeUI:专为开发微信HTML5应用的开源Web UI组件库
  19. The Butcher
  20. Python核心编程16 ----- 文件的打开(读取),修改,关闭,二进制

热门文章

  1. android 不能接收组播数据,但能够发送组播数据
  2. Oracle 自己主动诊断资料档案库 (ADR)、自己主动诊断工作流、ADRCI工具
  3. HDU 1181 变形课(dfs)
  4. “stdafx.h”: No such file or directory
  5. oracle错误:1067进程意外终止
  6. 在mvc4里怎样引用:System.Web.Optimization和entityframework
  7. 运用代码管理段来提升开发效率
  8. 如何给multicraft装PHP,我的世界Linux搭建Multicraft网页后台教程更新和添加服务端文件...
  9. 字数监控,价格监控等
  10. docker容器修改开机启动服务器,docker-修改容器挂载目录的3种方法小结