###题目链接###

题目大意:一开始手上有 0 个节点,有 n 天抉择,m 种方案,在每天中可以选择任意种方案、任意次地花费 x 个节点(手上的节点数不能为负),使得在 n 天结束后,获得 y 个节点。

其次,在每天结束后,会根据自己手上所具有的节点数来获得一些节点,设当天结束后所拥有 x 个节点,那么将获得 f(x) 个节点。

分析:

1、将全过程分为 n 天,每天开始有一定的节点数,然后 DP 求得花费后的最大价值(这个最大价值指的是,n 天结束后仅返还获得的最大节点数)。故设 dp[i][j] 表示在第 i 天花费操作完后,所能在最后一天返还节点数的最大值。

2、很显然这是一个完全背包问题。在 DP 处理每天话费节点之前,需要更新当天最开始所拥有的节点数所代表的 价值 (即结束返还的总节点数)。而当天一开始的节点数由上一天末尾所持有的节点数 x  + 上一天结束后获得的节点数 f(x) 。

故枚举上一天结束后所持有的节点数 j ,则有: dp[i][j+f[j]]=max( dp[i][j+f[j]] , dp[i-1][j] ) 。

直接枚举物品数:

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int n,m,k;
int s[];
int dp[][];
struct Good{
int a,b;
}A[];
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=k;i++) scanf("%d",&s[i]);
for(int i=;i<=m;i++){
scanf("%d%d",&A[i].a,&A[i].b);
}
memset(dp,0xc0c0c0c0,sizeof(dp));
dp[][]=;
for(int i=;i<=n;i++){
for(int j=;j<=k;j++){
dp[i][j+s[j]]=max(dp[i][j+s[j]],dp[i-][j]);
}
for(int w=;w<=m;w++){
for(int j=A[w].a;j<=;j++){
for(int e=;e<=j/A[w].a;e++){
dp[i][j-e*A[w].a]=max(dp[i][j-e*A[w].a],dp[i][j]+e*A[w].b);
}
}
}
}
int ans=;
for(int i=;i<=;i++){
ans=max(ans,dp[n][i]+i+s[i]);
}
printf("%d\n",ans);
}

优化要注意的是:由于这里的 dp 转移方程的方向是从末端向前转移过来的,而完全背包优化掉一个循环的原理是要用到在本层之前的物品状态,故枚举方向对应的也需要从末端向前端。

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int n,m,k;
int s[];
int dp[][];
struct Good{
int a,b;
}A[];
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=k;i++) scanf("%d",&s[i]);
for(int i=;i<=m;i++){
scanf("%d%d",&A[i].a,&A[i].b);
}
memset(dp,0xc0c0c0c0,sizeof(dp));
dp[][]=;
for(int i=;i<=n;i++){
for(int j=;j<=k;j++){
dp[i][j+s[j]]=max(dp[i][j+s[j]],dp[i-][j]);
}
for(int w=;w<=m;w++){
for(int j=;j>=A[w].a;j--){
dp[i][j-A[w].a]=max(dp[i][j-A[w].a],dp[i][j]+A[w].b);
}
}
}
int ans=;
for(int i=;i<=;i++){
ans=max(ans,dp[n][i]+i+s[i]);
}
printf("%d\n",ans);
}

Comet OJ - Contest #11 B题 usiness的更多相关文章

  1. Comet OJ - Contest #11 题解&赛后总结

    Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...

  2. Comet OJ - Contest #11 A 水题

    Code: #include <bits/stdc++.h> #define N 3000000 using namespace std; char str[N]; int main() ...

  3. Comet OJ - Contest #4 B题 奇偶性

    题目链接:https://www.cometoj.com/contest/39/problem/B?problem_id=1577 题意:给你一个数列,求L 到 R 区间内 所有数列 (ƒn mod ...

  4. Comet OJ - Contest #10 C题 鱼跃龙门

    ###题目链接### 题目大意: 给你一个 x ,让你求出最小的正整数 n 使得 n * (n + 1) / 2  % x == 0 ,即 n * (n + 1)  % 2x == 0 . 分析: 1 ...

  5. Comet OJ - Contest #11题解

    传送门 \(A\) 咕咕咕 const int N=1e6+5; char s[N],t[N];int n,res; inline bool cmp(const int &x,const in ...

  6. Comet OJ - Contest #0 A题 解方程 (数学)

    题目描述 小象同学在初等教育时期遇到了一个复杂的数学题,题目是这样的: 给定自然数 nn,确定关于 x, y, zx,y,z 的不定方程 \displaystyle \sqrt{x - \sqrt{n ...

  7. Comet OJ - Contest #10 B题 沉鱼落雁

    ###题目链接### 题目大意:有 n 个正整数,每个正整数代表一个成语,正整数一样则成语相同.同一个正整数最多只会出现 3 次. 求一种排列,使得这个排列中,相同成语的间隔最小值最大,输出这个最小间 ...

  8. Comet OJ - Contest #11 B 背包dp

    Code: #include <bits/stdc++.h> #define N 1005 #define M 2000 #define setIO(s) freopen(s". ...

  9. Comet OJ - Contest #11 D isaster 重构树+倍增+dfs序+线段树

    发现对于任意一条边,起决定性作用的是节点编号更大的点. 于是,对于每一条边,按照节点编号较大值作为边权,按照最小生成树的方式插入即可. 最后用线段树维护 dfs 序做一个区间查询即可. Code: # ...

随机推荐

  1. 小白的springboot之路(二)、集成swagger

    0-前言 现在的项目开发,基本都是前后端分离,后端专注于API接口开发,都需要编写和维护API接口文档.如果你还在用Word来编写接口文档,那你就out了,这个时候,当当当当~神兵利器swagger隆 ...

  2. Spring Boot 自动装配(二)

    目录 目录 前言 1.起源 2.Spring Boot 自动装配实现 2.1.@EnableAutoConfiguration 实现 2.1.1. 获取默认包扫描路径 2.1.2.获取自动装配的组件 ...

  3. CSRF的原理与防御 | 你想不想来一次CSRF攻击?

    CSRF是Cross Site Request Forgery的缩写,中文翻译过来是跨站请求伪造.这个漏洞往往能给用户带来巨大的损失,CSRF在等保安全检测中,也是一个非常重要的检测项.但是在我们的网 ...

  4. webpack4.0各个击破(6)—— Loader篇【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  5. Python一秒搭建ftp服务器,帮助你在局域网共享文件

    "老板 来碗面" "要啥面?" "内牛满面.." 最近项目上的事情弄得人心累,本来是帮着兄弟项目写套入口代码,搞着搞着就被拉着入坑了.搞开发 ...

  6. 洛谷 CF402A Nuts 题解

    本蒟蒻又来发题解啦! 这题是个紫题? 好吧,恶意评分可海星? 回到正题 这题很明显是贪心啊: 有a个坚果,b个隔板,x个隔板,最多分成v个区间. 那么我们的贪心策略是: 如果一共使用的挡板小于x,且当 ...

  7. luogu P3913 车的攻击 |数学

    题目描述 N×N 的国际象棋棋盘上有KK 个车,第ii个车位于第R_i行,第C_i列.求至少被一个车攻击的格子数量. 车可以攻击所有同一行或者同一列的地方. 输入格式 第1 行,2 个整数N,K. 接 ...

  8. HDU-6115

    我们将A省简化为由N个城市组成,某些城市之间存在双向道路,而且A省的交通有一个特点就是任意两个城市之间都能通过道路相互到达,且在不重复经过城市的情况下任意两个城市之间的到达方案都是唯一的.聪明的你一定 ...

  9. CoderForces999E-Reachability from the Capital

    E. Reachability from the Capital time limit per test 2 seconds memory limit per test 256 megabytes i ...

  10. 笔记||Python3之算法

    循环嵌套:先从外层循环里面取出一个元素,再执行内层的循环:当内层的循环都执行后,再执行外层循环. for循环嵌套语法: for  x  in  range(): for  y  in  range() ...