01背包问题,但是有两个变量体积(vol)和质量(m)
我们知道,一个变量的01背包大概是这么写的(随便举的例子):
for(int i=1;i<=n;i++)
{
for(int j=v;j>=vol;j--)
{
dp[j]=max(dp[j],dp[j-vol]+val);
}
}
仿照这个代码可以写成:
for (ll j = maxv; j >= fd.vol; j--)
{
for (ll k = maxm; k >= fd.m; k--)
{
dp[k][j] = max(dp[k][j], dp[k - fd.m][j - fd.vol] + fd.k);
}
}
下面是完整的代码。看标注应该能懂了。
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
typedef long long ll;
ll dp[500][500];
struct node
{
ll vol, m, k;//体积,重量,卡路里
}fd;//food
int main()
{
ll maxv, maxm;
scanf("%lld %lld", &maxv, &maxm);//最大体积,最大质量
ll n;
scanf("%lld", &n);
while (n--)
{
scanf("%lld %lld %lld", &fd.vol, &fd.m, &fd.k);
for (ll j = maxv; j >= fd.vol; j--)
{
for (ll k = maxm; k >= fd.m; k--)
{
dp[k][j] = max(dp[k][j], dp[k - fd.m][j - fd.vol] + fd.k);
}
}
}
printf("%lld", dp[maxm][maxv]);
return 0;
}