题解:洛谷-P8548 小挖的买花

挺明显的一道板子题。

题目大意

就是普通的二维费用背包,只是会给出 \(q\) 个询问,每个询问给出一个总价格 和一个总新鲜值

我们需要求出在不同的要求下可以获得的最大美丽值

题目分析

回想一下,我们在做这类题目的时候,在计算出最终的答案的过程中,我们是不是也把每个状态的最优解也算出来了?所以,我们可以直接进行一次这样的预处理以获得全部状态的最优解,接下来输出就行了。

动态规划预处理

由于有两个需要注意的量,我们把动态规划数组设为两维的。

设 \(f_{i,j}\) 为使用 \(i\) 费用,新鲜值为 \(j\) 时的最大美丽值。易得方程:

\[f_{i,j}=\max(f_{i,j},f_{{i-cost_k},{j-fr_k}}+be_k) \]

代码实现

cpp 复制代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,f[1005][1005],tmp1,tmp2;
struct str{
    int cost,fr,be;
}q[505];
signed main()
{
    scanf("%lld%lld",&n,&m);//输入数据
    for(int j=0;j<=500;j++)
    {
        for(int k=1;k<=500;k++) f[j][k]=-0x7fffffff;
    }
    for(int i=1;i<=n;i++) scanf("%lld%lld%lld",&q[i].cost,&q[i].fr,&q[i].be);
    for(int i=1;i<=n;i++)//动态规划预处理
    {
        for(int j=500;j>=q[i].cost;j--)
        {
            for(int k=500;k>=0;k--) f[j][k]=max(f[j][k],f[j-q[i].cost][max(k-q[i].fr,0ll)]+q[i].be);//这里,我们不能直接将k定到q[i].fr以达到无需特判的效果,因为如果它小于0的话我们可以直接使用0的状态进行转移(血的教训呜呜呜)
        }
    }
    for(int i=1;i<=m;i++)//输出答案
    {
        scanf("%lld%lld",&tmp1,&tmp2);
        printf("%lld",max(0ll,f[tmp1][tmp2]));
        if(i!=m)printf("\n");
    }
    return 0;
}
相关推荐
王老师青少年编程6 天前
2020年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第2题)
c++·题解·真题·初赛·信奥赛·csp-s·提高组
王老师青少年编程7 天前
csp信奥赛C++之摩尔投票算法详解
数据结构·c++·算法·题解·csp·信奥赛·摩尔投票算法
Tisfy9 天前
LeetCode 762.二进制表示中质数个计算置位:位运算(mask O(1)判断)
算法·leetcode·题解·位运算·质数
王老师青少年编程9 天前
2020年信奥赛C++提高组csp-s初赛真题及答案解析(完善程序第1题)
c++·题解·真题·初赛·信奥赛·csp-s·提高组
王老师青少年编程9 天前
2020年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第1题)
c++·题解·真题·初赛·信奥赛·csp-s·提高组
alexwang2119 天前
B2007 A + B 问题 题解
c++·算法·题解·洛谷
王老师青少年编程10 天前
2020年信奥赛C++提高组csp-s初赛真题及答案解析(选择题11-15)
c++·题解·真题·初赛·信奥赛·csp-s·提高组
Tisfy10 天前
LeetCode 1523.在区间范围内统计奇数数目:两种方法O(1)算
算法·leetcode·题解
王老师青少年编程11 天前
2020年信奥赛C++提高组csp-s初赛真题及答案解析(选择题6-10)
c++·题解·真题·初赛·信奥赛·csp-s·提高组