1750. 运动会

限制条件

时间限制: 1 秒, 内存限制: 32 兆

题目描述

ZEH是一名04级的学生,他除了绩点高,还有运动细胞。有一次学院举办运动会,ZEH发现里面的 项目都是他所向披靡的,当然他想获得所有项目的No1,但是一个人的精力总是有限的,ZEH也是只有P(Power的简写,一个大于0且小于1000的整 数)的精力。如果精力足够参加比赛,一定能赢;相反,精力不够去参加比赛,Loss的概率很大,ZEH当然不想因为Loss而不爽。

整个运动会有N(大于0且小于等于100)项比赛,每项比赛都是在指定的一天D(D大于等于0)内举行完,但是一天可能同时有多个比赛同时进 行,ZEH当然就不能同时兼顾。比赛结束后,院长都会亲自为冠军颁发一定数额的奖金,其他名次只有一张奖状。ZEH当然是冲着奖金去的,他想获得最多的奖 金,师弟师妹们,你能帮ZEH大牛计算出他最多能拿多少奖金吗?

输入格式

第一行是一个整数T,表示这题有T个用例。
每个用例的第一行有两个正整数P N,分别表示ZEH的精力和比赛的项目。
第二行到第N+1行是N个项目,每一行有三个正整数D E M,分别表示这个项目在第D天举行,需要E的精力,和比赛的奖金。项目的顺序都按D排好序。

输出格式

对于每个用例,输出他能拿的最多的奖金。

样例输入

1
14 5
0 3 7
0 2 5
1 4 2
2 6 14
2 8 15

样例输出

23

刚开始的时候用一维dp[]去做,死活过不了,找了很久也没有找到原因,如果有哪位大神刚好看见,可以帮帮我查错。
后来改用了二维的dp[][]做,顺利的AC。 这一题题目本身就有问题,提纲上说D是正整数,但是例子里面给的D第一个就为0,这个我们先不管,考虑题目本身。 题目本身就是一个典型的分组背包问题,首先,将给定的项目按天分组,用合适的数据结构存储起来。
然后,按0-1背包的做法对天数进行选择,再在每天里对当天的项目做一个重复比较,最后一天只选到一个项目,原理和0-1背包是一致的。 核心代码:
 for(int i=;i<=D;i++){
if(xmP[i].size()==)
continue;
for(int j=P;j>=;j--){
if (i>)
dp[i][j]=dp[i-][j];
for(int k=;k<xmP[i].size();k++){
if(xmP[i][k]<=j){
if(i>)
dp[i][j]=max(dp[i][j],dp[i-][j-xmP[i][k]]+xmM[i][k]);
else
dp[i][j]=max(dp[i][j],dp[i][j-xmP[i][k]]+xmM[i][k]);
}
}
Max=max(Max,dp[i][j]);
}
}

对第0天的情况特殊处理了,还要注意dp[i][j]=max(dp[i][j],dp[i-1][j-xmP[i][k]]+xmM[i][k]);里的是dp[i][j]并不是dp[i-1][j]。

因为这里需要跟当天的上一个项目得出的结果做一个比较。

if (i>0)
dp[i][j]=dp[i-1][j];
已经进行了初始化,所以一开始进入k的循环dp[i][j]就是当天不选项目即dp[i-1][j]的情况。
附上全部代码:
#include<iostream>
#include<vector>
#include<algorithm>
#include<memory.h> using namespace std; int main()
{
int T,P,N,D,E,M;
int dp[][];
vector<int> xmP[];
vector<int> xmM[];
cin>>T;
while(T--){
cin>>P>>N;
for(int i=;i<;i++){
xmP[i].clear();
xmM[i].clear();
}
for(int i=;i<N;i++){
cin>>D>>E>>M;
xmP[D].push_back(E);
xmM[D].push_back(M);
}
memset(dp,,sizeof(dp));
int Max=;
for(int i=;i<=D;i++){
if(xmP[i].size()==)
continue;
for(int j=P;j>=;j--){
if (i>)
dp[i][j]=dp[i-][j];
for(int k=;k<xmP[i].size();k++){
if(xmP[i][k]<=j){
if(i>)
dp[i][j]=max(dp[i][j],dp[i-][j-xmP[i][k]]+xmM[i][k]);
else
dp[i][j]=max(dp[i][j],dp[i][j-xmP[i][k]]+xmM[i][k]);
}
}
Max=max(Max,dp[i][j]);
}
}
cout<<Max<<endl;
}
return ;
}

分组背包——sicily 1750的更多相关文章

  1. HDU 1712 ACboy needs your help(分组背包)

    题意:给你n的课程组,每个课程组有m个课程,每个课程有一个完成时间与价值.问在m天内每组课程组最多选择一个,这样可以得到的最大价值是多少 题解:分组背包,其实就是每个课程组进行01背包,再在课程组内部 ...

  2. Codeforces Round #383 (Div. 2) D 分组背包

    给出一群女孩的重量和颜值 和她们的朋友关系 现在有一个舞台 ab是朋友 bc是朋友 ac就是朋友 给出最大承重 可以邀请这些女孩来玩 对于每一个朋友团体 全邀请or邀请一个or不邀请 问能邀请的女孩的 ...

  3. HDU 3033 分组背包变形(每种至少一个)

    I love sneakers! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. HDU 1712 分组背包

    ACboy needs your help Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  5. Codeforces Round #383 (Div. 2) D. Arpa's weak amphitheater and Mehrdad's valuable Hoses(分组背包+dsu)

    D. Arpa's weak amphitheater and Mehrdad's valuable Hoses Problem Description: Mehrdad wants to invit ...

  6. HDU3535AreYouBusy[混合背包 分组背包]

    AreYouBusy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  7. POJ1837 Balance[分组背包]

    Balance Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 13717   Accepted: 8616 Descript ...

  8. Codevs1378选课[树形DP|两种做法(多叉转二叉|树形DP+分组背包)---(▼皿▼#)----^___^]

    题目描述 Description 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了N(N<300)门的选修课程,每个学生可选课程的数量M是给定的.学生选修 ...

  9. hdu1712 分组背包

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1712 题意:有n门课程,和m天时间,完成mp[i][j]得到的价值为第i行j列的数字,求最 ...

随机推荐

  1. python2.7版本win7 64位系统安装pandas注意事项_20161226

    经过卸载安装python几经折腾,参考了各种网站,终于安装成功. [成功的步骤] 保存这个python第三方库网站,网址是http://www.lfd.uci.edu/~gohlke/pythonli ...

  2. string.Join()的用法

    List<string> list = new List<string>(); list.Add("I"); list.Add("Love&quo ...

  3. PHP实现队列及队列原理

    看看各语言实现队列的方法:PHP实现队列:第一个元素作为队头,最后一个元素作为队尾 <?php /** * 队列就是这么简单 * * @link http://www.phpddt.com */ ...

  4. 第五章 征服数据库(Spring对DB的使用)——开发持久层

    本章内容: 定义Spring对数据库访问的支持 配置数据库资源 使用Spring的JDBC模板 在几乎所有的企业级应用中,都需要构建数据持久层.现在意义上的数据持久层是指把对象或者数据保存到数据库中, ...

  5. 321android浏览器

    [应用简介] 321浏览器是IT蓝豹创始人在2012年的时候业余时间研发的项目,现在很多各大网站都扒了我们的源码, 并且还插入了他们的广告,这是一件特别令人痛恨的事,如果需要下载整版的同学们就上IT蓝 ...

  6. android 音频焦点

    音频焦点分为两种 1永久占用((AudioManager) getSystemService(AUDIO_SERVICE)) .requestAudioFocus(null, AudioManager ...

  7. tomcat开机启动

    最近老板租了个阿里云的服务器,动不动就自动重启,搞得我还得有事没事盯着服务器,谁知道它什么时候会重启啊,为了让自己不要那么累,也为了不要造成不必要的麻烦,还是把tomcat改成开机启动的程序吧. 网上 ...

  8. 【项目】搜索广告CTR预估(二)

    项目介绍 给定查询和用户信息后预测广告点击率 搜索广告是近年来互联网的主流营收来源之一.在搜索广告背后,一个关键技术就是点击率预测-----pCTR(predict the click-through ...

  9. ROC曲线、AUC、Precision、Recall、F-measure理解及Python实现

    本文首先从整体上介绍ROC曲线.AUC.Precision.Recall以及F-measure,然后介绍上述这些评价指标的有趣特性,最后给出ROC曲线的一个Python实现示例. 一.ROC曲线.AU ...

  10. sizeof 跟 strlen 的区别

    1.参数 sizeof是c/c++ 中的一个操作符,其作用是返回对象或数据类型所占的内存字节数. 用法:sizeof(对象).sizeof 对象.sizeof(类型) 如果类型做参数,返回的是该类型所 ...