AcWing_8 二维费用的背包问题(模板)

AcWing

8. 二维费用的背包问题

二维费用的背包问题不仅对物品的体积有限制,还对物品的重量有限制。思路与普通的背包问题一样,只需要将dp数组多开一维,再多加一层循环遍历背包重量即可。

完整地,f[n][m][g] = max(f[n-1][m][g], f[n-1][m-vv[i]][g-gg[i]] + w[i]),所以体积和重量要从大到小遍历。

#include <bits/stdc++.h>
using namespace std;
int n, m, g;
const int N = 1010, M = 110, G = 110;
int f[M][G];
int vv[N], gg[N], w[N];
int main(){
    cin >> n >> m >> g;
    for(int i = 1; i <= n; i++) cin >> vv[i] >> gg[i] >> w[i];
    for(int i = 1; i <= n; i++)
        for(int j = m; j >= vv[i]; j--)
            for(int k = g; k >= gg[i]; k--)
                f[j][k] = max(f[j][k], f[j-vv[i]][k-gg[i]] + w[i]);
    cout << f[m][g] << endl;
    return 0;
}