SRM 563 Div1 500 SpellCards
阿新 • • 發佈:2018-11-12
Description
有n張符卡排成一個佇列,每張符卡有兩個屬性,等級lili和傷害didi。
你可以做任意次操作,每次操作為以下二者之一:
- 把隊首的符卡移動到隊尾。
- 使用隊首的符卡,對敵人造成di點傷害,並丟棄隊首的li張符卡(包括你所使用的符卡)。如果佇列不足li張符卡那麼你不能使用。
求出造成的傷害的總和的最大值。
\(1\len\le50,1\leli\le50,1\ledi\le10000\)
Solution
發現這就是一個揹包問題
Code
#include <algorithm> #include <stdio.h> #include <vector> using namespace std; class SpellCards { int f[105]; public: int maxDamage(vector<int> l, vector<int> d) { int n = l.size(); for (int i = 0; i < n; i += 1) for (int j = n; j >= l[i]; j -= 1) f[j] = max(f[j], f[j - l[i]] + d[i]); return *max_element(f + 1, f + n + 1); } };