蓝桥杯 试题 算法提高 肌肉男看电影(C++)

题目浏览

资源限制
时间限制:2.0s 内存限制:256.0MB

T大计算机系费尽九牛二虎之力,终于挖来了某系第一肌肉男(从此被称为计算机第0肌肉男)。他平时除了自习,就是看电影,尤其是一些霓虹的台词较少的动作片。但是即使肌肉男有强大的肌肉,仍然会面临每个月有限的流量耗尽的问题。已知肌肉男的流量p是有限的,现在有某舍友提供的n部最新电影,看每部电影会消耗肌肉男一定的流量,但是也会给肌肉男带来一定的兴奋值。肌肉男想在自己有能力的情况下产生最多的兴奋值,他由于平时忙于上自习,把这个任务交给了你,如果你能完成,他就帮你领一年的外卖哦!
  
  输入数据第一行有一个数字p,表示肌肉男的流量值;第二行是一个数字n,表示一共有n部电影;以下有n行,每行第一个数表示该电影消耗的流量大小,第二个数表示该电影带给肌肉男的兴奋值。
  
  输出数据只有一行,表示肌肉男所能达到的最大兴奋值。

算法浏览

#include<iostream>
#include<algorithm>

const int N = 100010;

using namespace std;

int p,n;
int v[N], w[N];//消耗的流量的大小,兴奋值
int dp[N];//影片为i,流量为j的最大兴奋值

int main()
{
    cin >> p >> n;
    for(int i = 1; i <= n; i++)
        scanf("%d%d", &v[i], &w[i]);

    for(int i = 1; i <= n; i++)
        for(int j = p; j >= v[i]; j--)
            dp[j] = max(dp[j], dp[j - v[i]] + w[i]);

    cout << dp[p] << endl;
}

核心思路

我肯定没懂题目里讲的是啥(

经典的01背包问题

背包的容量 — 拥有的流量
物品的价值 — 给予的兴奋值
物品的重量 — 下载所消耗的流量

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值