$\huge \color{orange}{成魔之路->}$ $\huge \color{purple}{算法提高课题解}$
结论: $f[i][j][k]=\min(f[i-1][j][k],f[i-1][j-v_1][k-v_2]+w)$
思路:
-
$1. 状态表示$
$集合:从前\ i\ 个物品中选,体积1至少是\ j,体积2至少是\ k\ 的最小价值$
$属性:\min$ -
$2. 状态转移$
$不选第i个物品:f[i-1][j][k]$
$选择第i个物品:f[i-1][j-v_1][k-v_2]+w$ -
$3. 滚动数组$
$由于\ f[i][j][k]\ 只需用到当前层和上一层,则结论可转化为:$
$f[j][k]=\min(f[j][k],f[j-v_1][k-v_2]+w)$
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N = 25, M = 80;
int n,m,k;
int f[N][M];
int main()
{
cin>>n>>m>>k;
memset(f,0x3f,sizeof f);
f[0][0]=0; //氧气不超过 0,氮气不超过 0 的气缸的最小体重
for(int i=0;i<k;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);
}
cout<<f[n][m]<<endl;
return 0;
}