链接:https://www.nowcoder.com/acm/contest/141/A
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
Special Judge, 64bit IO Format: %lld

题目描述

Eddy was a contestant participating in ACM ICPC contests. ACM is short for Algorithm, Coding, Math. Since in the ACM contest, the most important knowledge is about algorithm, followed by coding(implementation ability), then math. However, in the ACM ICPC World Finals 2018, Eddy failed to solve a physics equation, which pushed him away from a potential medal.

Since then on, Eddy found that physics is actually the most important thing in the contest. Thus, he wants to form a team to guide the following contestants to conquer the PACM contests(PACM is short for Physics, Algorithm, Coding, Math).

There are N candidate groups each composed of pi physics experts, ai algorithm experts, ci coding experts, mi math experts. For each group, Eddy can either invite all of them or none of them. If i-th team is invited, they will bring gi knowledge points which is calculated by Eddy's magic formula. Eddy believes that the higher the total knowledge points is, the better a team could place in a contest. But, Eddy doesn't want too many experts in the same area in the invited groups. Thus, the number of invited physics experts should not exceed P, and A for algorithm experts, C for coding experts, M for math experts.

Eddy is still busy in studying Physics. You come to help him to figure out which groups should be invited such that they doesn't exceed the constraint and will bring the most knowledge points in total.

输入描述:

The first line contains a positive integer N indicating the number of candidate groups. Each of following N lines contains five space-separated integer p i, ai, ci, mi, gi indicating that i-th team consists of pi physics experts, ai algorithm experts, ci coding experts, mi math experts, and will bring gi knowledge points. The last line contains four space-separated integer P, A, C, M indicating the maximum possible number of physics experts, algorithm experts, coding experts, and math experts, respectively.
1 ≤ N ≤ 36 0 ≤ pi,ai,ci,mi,gi ≤ 36 0 ≤ P, A, C, M ≤ 36

输出描述:

The first line should contain a non-negative integer K indicating the number of invited groups. The second line should contain K space-separated integer indicating the index of invited groups(groups are indexed from 0).
You can output index in any order as long as each index appears at most once. If there are multiple way to reach the most total knowledge points, you can output any one of them. If none of the groups will be invited, you could either output one line or output a blank line in the second line.

case1:

输入

2

1 0 2 1 10

1 0 2 1 21

1 0 2 1

输出

1

1

case2:

输入

1 2 1 1 0 31

1 0 2 1

输出

0

题目大意:有一个四维背包,求取得最大值的方式(即有多少组,和具体组的 index)

思路:背包,但是要注意数据的类型要用short或者char,否则会爆内存。其次不能用滚动数组优化,因为要回溯到具体哪一组。做法一就是单纯的五维背包

状态:dp[ i ][ p ][ a ][ c ][ m ] 走了 i 组背包容量为 p, a, c, m 的最大值

状态转移: dp[ i ][ p ][ a ][ c ][ m ] = max(dp[i-1][ p ][ a ][ c ][ m ], dp[i-1][ p-ip[i] ][ a-ia[i] ][ c-ic[i] ][ m-im[i] ]);

这里回溯答案的话,用一个bool in[ i ][ p ][ a ][ c ][ m ]记录在当前状态有没有取第 i 组;

AC code:

 #include <vector>
#include <cstdio>
#include <iostream>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std; const int MAXN = ; short dp[MAXN][MAXN][MAXN][MAXN][MAXN];
int ip[MAXN], ia[MAXN], ic[MAXN], im[MAXN], g[MAXN];
bool in[MAXN][MAXN][MAXN][MAXN][MAXN];
int N, P, A, C, M; void slv()
{
for(int i = ; i <= N; i++) ///初始化
for(int p = ; p <= P; p++)
for(int a = ; a <= A; a++)
for(int c = ; c <= C; c++)
for(int m = ; m <= M; m++)
in[i][p][a][c][m] = false; for(int i = ; i <= N; i++)
{
for(int p = ; p <= P; p++) ///省去下面比较前一个取或者不取,一律初始化为不取
for(int a = ; a <= A; a++)
for(int c = ; c <= C; c++)
for(int m = ; m <= M; m++)
{
dp[i][p][a][c][m] = dp[i-][p][a][c][m];
}
for(int p = P; p >= ip[i]; p--)
for(int a = A; a >= ia[i]; a--)
for(int c = C; c >= ic[i]; c--)
for(int m = M; m >= im[i]; m--)
{
if(dp[i][p][a][c][m] < (dp[i-][p-ip[i]][a-ia[i]][c-ic[i]][m-im[i]]+g[i]))
{
dp[i][p][a][c][m] = dp[i-][p-ip[i]][a-ia[i]][c-ic[i]][m-im[i]]+g[i];
in[i][p][a][c][m] = true; ///取了第 i 组
}
}
}
vector<int>ans;
for(int i = N; i > ; i--)
{
if(in[i][P][A][C][M])
{
ans.push_back(i-); ///题目下标从 0 开始
P-=ip[i]; ///但是这里数组下标是从 1 开始
A-=ia[i];
C-=ic[i];
M-=im[i];
}
} printf("%d\n", (int)ans.size());
for(size_t i = ; i < ans.size(); i++)
{
printf("%d", ans[i]);
if(i+ < ans.size()) printf(" ");
else printf("\n");
}
}
int main()
{
scanf("%d", &N);
for(int i = ; i <= N; i++)
{
scanf("%d %d %d %d %d", &ip[i], &ia[i], &ic[i], &im[i], &g[i]);
}
scanf("%d %d %d %d", &P, &A, &C, &M);
slv();
return ;
}

(第三场) A PACM Team 【dp,五维背包】的更多相关文章

  1. 牛客多校第三场 A—pacm team (4维背包加路径压缩)

    链接:https://www.nowcoder.com/acm/contest/141/A 来源:牛客网 Eddy was a contestant participating , Eddy fail ...

  2. 牛客网多校训练第三场 A - PACM Team(01背包变形 + 记录方案)

    链接: https://www.nowcoder.com/acm/contest/141/A 题意: 有n(1≤n≤36)个物品,每个物品有四种代价pi,ai,ci,mi,价值为gi(0≤pi,ai, ...

  3. PACM Team(牛客第三场多校赛+dp+卡内存+打印路径)

    题目链接(貌似未报名的不能进去):https://www.nowcoder.com/acm/contest/141/A 题目: 题意:背包题意,并打印路径. 思路:正常背包思路,不过五维的dp很容易爆 ...

  4. dp - 3维背包(东四省)

    题意: 给你 n 张卡片,总共可以消耗的法力值,求最多可以造成多少伤害, 卡片分为2种,一种是魔法卡,使用后可以使所有的连环卡的费用全部减1,另一种是连环卡,因魔法卡的使用可以使其费用减1,问最终最多 ...

  5. 2018牛客网暑期ACM多校训练营(第三场) A - PACM Team - [四维01背包][四约束01背包]

    题目链接:https://www.nowcoder.com/acm/contest/141/A 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...

  6. 牛客多校第三场 A- PACM Team 背包/记忆路径

    https://www.nowcoder.com/acm/contest/141#question 一眼背包,用四维dp记录在A,B,C,D条件限制下可以获得的最大知识点,但是题目要求输出路径,在输入 ...

  7. 2018 HDU多校第三场赛后补题

    2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...

  8. BZOJ_1864_[Zjoi2006]三色二叉树_树形DP

    BZOJ_1864_[Zjoi2006]三色二叉树_树形DP 题意: 分析:递归建树,然后DP,从子节点转移. 注意到红色和蓝色没有区别,因为我们可以将红蓝互换而方案是相同的.这样的话我们只需要知道当 ...

  9. 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-I.html 题目传送门 - 2018牛客多校赛第三场 I ...

随机推荐

  1. 【程序员技术练级】学习一门脚本语言 python(三)跟数据库打交道

    接着上一篇,该篇讲述使用python对数据库进行基本的CRUD操作,这边以sqlite3为例子,进行说明.sqlite3 是一个非常轻型的数据库,安装和使用它是非常简单的,这边就不进行讲述了. 在py ...

  2. java 读写操作大文件 BufferedReader和RandomAccessFile

    一 老问这问题,两个都答出来算加分项? 二 具体代码如下,没什么好说的直接说对比. BufferedReader和RandomAccessFile的区别RandomAccessFile 在数据越大,性 ...

  3. C# 定制特性

    一.初识特性 特性(attribute)是被指定给某一声明的一则附加的声明性信息. 设计类型的时候可以使用各种成员来描述该类型的信息,但有时候我们可能不太愿意将一些附加信息放到类的内部,因为这样,可能 ...

  4. Java 获取当前时间距离当天凌晨的秒数

    原文出自:https://blog.csdn.net/seesun2012 在前期项目中遇到一个客户端与服务器间的时间同步问题,需要获取到当前时间与当天凌晨时间距离的秒数,写这篇文章主要是为了总结一下 ...

  5. goto语句和标签

    goto 语句用于将执行流更改到标签处,虽然t-sql和pl/sql都提供了该语句,但是作为编程而言,我们不推荐使用此编程技术.要编写一个标签,应当在标识符后面加一个冒号.列如,下面示例使用goto语 ...

  6. 解决:用nvm成功安装nodejs,却无法使用nvm和node命令

    问题 一个前端朋友,用Macbook pro成功安装nvm以及node环境,系统查询不到 $ nvm $ -bash: nvm: command not found $ node $ -bash: n ...

  7. mysql应用学习-在cmd命令窗口下创建数据库和表

    运行以下操作,请确认您已经正确安装和配置了mysql. 首先要运行cmd.exe,进入命令窗口. step1. 进入MySQL monitor 如果您已登录mysql,可直接进入step2;若未登录请 ...

  8. common-jdbc:一个基于SpringJdbcTemplate的高性能数据库操作工具类库

    项目地址:https://gitee.com/cnsugar/common-jdbc 一.简介 基于SpringJdbcTemplate的高性能数据库操作工具类库,支持mysql.oracle数据库, ...

  9. Hibernate中的一对一注解配置

    Card类 package cn.OneToOne2017109.entity; import javax.persistence.*; /** * Created by YSS on 2017/10 ...

  10. MySQL 修改数据表中的字段的字符编码

    1.查询 MySQL 的版本: SELECT VERSION(); 2.查询 MySQL 当前使用的字符集: SHOW VARIABLES LIKE '%character%'; 3.查询指定数据库的 ...