题目传送门

分析

将原问题做如下转化:

总钱数相当于背包总容量

每件物品的价格相当于体积

每件物品的价格乘以重要度相当于价值

那么就变成了经典的\(01\)背包问题。

01背包模型

状态表示\(f(i,j)\)—集合: 考虑前 \(i\) 个物品,且当前已使用体积为$ j$ 的方案

状态表示\(f(i,j)\)—属性: 该方案的价值为最大值 \(max\)

状态转移\(f(i,j)\)\(f(i,j)=\begin{equation} \left\{ \begin{array}{lr} 不选第i个物品: max\{f(i-1,j)\} & \\ 选第i个物品: max\{f(i-1,j-v_i)+w_i\}\\ \end{array} \right. \end{equation}\)

初始状态:f[0][0]

目标状态:f[n][m]

集合划分

AcWing 426. 开心的金明
#include<bits/stdc++.h>

using namespace std;
const int N = 30010;

int n, m;
int f[N];

int main() {
    //物品个数n
    cin >> m >> n;//注意一下这里输入的顺序

    //01背包模板
    for (int i = 1; i <= n; i++) {
        int v, w;
        cin >> v >> w;
        for (int j = m; j >= v; j--)
            f[j] = max(f[j], f[j - v] + v * w);
    }
    cout << f[m] << endl;
    return 0;
}

相关文章: