背包dp第四讲:二维费用背包板子及例题

特征

对于每件物品,具有两种不同的费用;选择这件物品必须同时付出这两种代价;对于每种代价都有一个可付出的最大值(背包容量)。问怎样选择物品可以得到最大的价值。

板子

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

acwing二维费用背包

#include

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

洛谷p1507 nasa的食物计划

#include

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

你可能感兴趣的:(背包九讲,背包问题,背包dp,二维费用背包)