- 过来冒个泡
- 一本通传送门
- 二维费用的背包,所以状态也要加一维
- 状态转移公式:
f[u+a[i]][v+b[i]]=min(f[u+a[i]][v+b[i]],f[u][v]+c[i])
- 看着很懵对吧,本质还是看加入第
i
项后f[i][j]
的值会不会更小(啊我觉得我用不明白这个文本编辑器,不标红看着更难受)
代码
#include<bits/stdc++.h>
using namespace std;
int f[110][110],a[1010],b[1010],c[1010];
int m,n,l;
int main()
{
cin>>m>>n>>l;
memset(f,0x3f,sizeof(f));
f[0][0]=0;
for(int i=1;i<=l;i++)
cin>>a[i]>>b[i]>>c[i];
for(int i=1;i<=l;i++)
for(int j=m;j>=0;j--)
for(int k=n;k>=0;k--){
int x=min(m,j+a[i]),y=min(n,k+b[i]);
f[x][y]=min(f[x][y],f[j][k]+c[i]);
}
cout<<f[m][n]<<endl;
return 0;
}