noip2005普及组 采药

题目

采药

算法

(DP,背包问题) O ( n m ) O(nm) O(nm)
经典01背包问题。

采药总时间相当于背包容量,每一株药相当于一件物品,采药时间相当于该物品的体积,草药的价值相当于物品价值。

时间复杂度

01背包问题的时间复杂度等于 物品数量 × 背包容量,因此本题的时间复杂度是 O ( n m ) O(nm) O(nm)

C++ 代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1010;

int n, m;
int f[N]; // 01背包的状态表示

int main()
{
    cin >> m >> n; // 先读入总容量和物品个数

    for (int i = 0; i < n; i++)
    {
        int v, w;
        cin >> v >> w; // 先读入体积再读入价值
        for (int j = m; j >= v; j--)
            f[j] = max(f[j], f[j - v] + w);
    }

    cout << f[m] << endl;

    return 0;
}

你可能感兴趣的:(oi)