特征
对于每件物品,具有两种不同的费用;选择这件物品必须同时付出这两种代价;对于每种代价都有一个可付出的最大值(背包容量)。问怎样选择物品可以得到最大的价值。
板子
for (int i = 1;i <= n;i++) {
for (int j = v;j >= c[i];j--) {
for (int g = m;g >= k[i];g--) {
dp[j][g] = max(dp[j][g], dp[j - c[i]][g - k[i]] + w[i]);
}
}
}
板子题1
#include<bits/stdc++.h>
using namespace std;
const int M = 1e4 + 9;
int dp[M][M], c[M], w[M], k[M];
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, v, m;cin >> n >> v >> m;
for (int i = 1;i <= n;i++)cin >> c[i] >> k[i] >> w[i];
for (int i = 1;i <= n;i++) {
for (int j = v;j >= c[i];j--) {
for (int g = m;g >= k[i];g--) {
dp[j][g] = max(dp[j][g], dp[j - c[i]][g - k[i]] + w[i]);
}
}
}
cout << dp[v][m];
return 0;
}
板子题2
#include<bits/stdc++.h>
using namespace std;
const int M = 2e4 + 9;
int dp[M][M], c[M], w[M], m[M];
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int h, t;cin >> h >> t;
int n;cin >> n;
for (int i = 1;i <= n;i++)cin >> c[i] >> m[i] >> w[i];
for (int i = 1;i <= n;i++)
for (int j = h;j >= c[i];j--)
for (int op = t;op >= m[i];op--)
dp[j][op] = max(dp[j][op], dp[j - c[i]][op - m[i]] + w[i]);
cout << dp[h][t];
return 0;
}