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