金明的预算方案DP(写伪了)

来源:互联网 发布:im源码 编辑:程序博客网 时间:2024/05/29 04:38

题目描述

金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过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]。(其中为乘号)

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

输入输出格式

输入格式:
输入的第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是所属主件的编号)

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

输入输出样例

输入样例#1:
1000 5
800 2 0
400 5 1
300 5 1
400 3 0
500 2 0
输出样例#1:
2200
说明

NOIP 2006 提高组 第二题


这是一个DP,但是很显然处理附件与主见的关系很麻烦 所以我天真的写了记忆化dfs但是嘞。。。。记搜的话会被后面的返回值覆盖dp数组 所以就废了一上午GGGG 然后听了众dalao意见写了DP 关键是:能写一维dp 不要写两维 会出玄学错误
dp[i] 意义:存体积(价格)为i 的最大∑w*v
然后处理每个主见的附件方案 处理方法是对于原有的方案 在新方案加入之后增加一种选该物品的方案 然后就OK了 代码:


#include<bits/stdc++.h>using namespace std;struct mainob{    int tot,w0[15],v0[15];    mainob(){tot=0;}}a[65];int n,w[65],v[65],m,T,ha[65],dp[320010],MM;int main(){    memset(dp,128,sizeof(dp));    cin>>m>>n;    for(int i=1;i<=n;i++)    {        cin>>w[i]>>v[i];int a_;cin>>a_;        if(!a_) ha[i]=++T,a[T].w0[++a[T].tot]=w[i],a[T].v0[a[T].tot]=v[i]*w[i];        else         {            int p=ha[a_];int TTT=a[p].tot;            for(int j=1;j<=TTT;j++)            {                a[p].w0[++a[p].tot]=a[p].w0[j]+w[i];                a[p].v0[a[p].tot]=a[p].v0[j]+v[i]*w[i];            }        }    }    dp[0]=0;    for(int i=1;i<=T;i++)     for(int j=m;j>=w[i];j--)     {        for(int k=1;k<=a[i].tot;k++) if(j-a[i].w0[k]>=0)        dp[j]=max(dp[j],dp[j-a[i].w0[k]]+a[i].v0[k]);        dp[j]=max(dp[j],dp[j]); MM=max(MM,dp[j]);     }    cout<<MM;}/*4500 12100 3 0400 5 0300 5 01400 2 0500 2 0800 2 41400 5 4300 5 01400 3 8500 2 01800 4 0440 5 1016700*/
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 浓硫酸沾到皮肤上应该怎么办 将浓硫酸沾到皮肤上怎么办 刷厕所的盐酸弄到皮肤上怎么办 死刑犯被执行后发现被冤枉的怎么办 觉得老公对自己不够关心体贴怎么办 孕期老公不知道关心不体贴怎么办? 中国和伊朗做贸易美国制裁怎么办 土地被村民霸占村长解决不了怎么办 村支书霸占群众选举村长的票怎么办 苹果手机自带的音乐软件删了怎么办 不小心把手机系统软件删了怎么办 佳能打印机打相片是打不全怎么办 卖家说我寄回去的包是假的怎么办 辞职后原单位没把档案给转出怎么办 天下行以租代购要起诉我怎么办 顺丰收件人电话地址都写错了怎么办 领导问任务完不成怎么办怎么回答 我和我老婆感情出现问题了怎么办 手机坏了手机浏览器里照片怎么办 不小心把电脑ie浏览器删了怎么办 华为手机自带浏览器中病毒了怎么办 手机打开浏览器提示中病毒了怎么办 手机卸载了浏览器和软件商店怎么办 房东在我租房期间贴房子出租怎么办 额头上毛孔大 还有些黑怎么办 孩子学跳舞老师压的疼怎么办 步步高点读机电池坏了怎么办 电脑连接受限制或无连接怎么办 电脑无线网受限制或无连接怎么办 电脑网络受限制或无连接怎么办 3 证书报考大专证书丢了怎么办 广工期末考试被老师警告了怎么办 我在农村不当队长我能力不够怎么办 我在农村不当队长我当代表怎么办 北京本地人社保中间断了一年怎么办 我想把大哥的孩子带出国要怎么办 美国有亲戚想让孩子出国怎么办 连接温控器的线断了怎么办 植发后好多原生发都脱落了怎么办 4岁宝宝支体能力差怎么办 当与游客发生矛盾时员工怎么办