1. 程式人生 > >SRM 563 Div1 500 SpellCards

SRM 563 Div1 500 SpellCards

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);
    }
};