本题和之前的二维背包差不多,但是它可以做到超出体积的限制,本质上我们的状态转移方程其实和之前的差不多,f[i][j]=min(f[i-1][j],f[i-1][j-v]+w),超出的体积应该如何去计算,我们可以利用负数去计算,也就是i-v1<0||j-v2<0但是这样会造成数组越界,我们只需要让他们呢和0比较即可,f[max(0,i-v1)][max(0,j-v2)+w]。本质上就是只要超过氧气,氮气的含量,不管多少,直接和f[0][0]比较,得到的就是当前最小的重量。
cpp
#include<bits/stdc++.h>
using namespace std;
int f[1010][1010];
int main()
{
int n,m;
cin>>n>>m;
int q;
cin>>q;
memset(f,0x3f,sizeof(f));
f[0][0]=0;
for(int i=1;i<=q;i++)
{
int v1,v2,w;
cin>>v1>>v2>>w;
for(int j=n;j>=0;j--)
{
for(int k=m;k>=0;k--)
{
f[j][k]=min(f[j][k],f[max(0,j-v1)][max(0,k-v2)]+w);
}
}
}
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=m;j++)
// {
// cout<<f[i][j]<<" ";
// }
// cout<<endl;
// }
cout<<f[n][m]<<endl;
return 0;
}