题目浏览
资源限制
时间限制: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背包问题
背包的容量 — 拥有的流量
物品的价值 — 给予的兴奋值
物品的重量 — 下载所消耗的流量