二维背包问题,实现起来有一些小细节
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
inline int rd(){
int ret=0,f=1;char c;
while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;
while(isdigit(c))ret=ret*10+c-'0',c=getchar();
return ret*f;
}
int O,N,n;
int f[30][90];
int main(){
O=rd();N=rd();n=rd();
memset(f,0x3f,sizeof(f));
for(int i=1;i<=n;i++){
f[0][0]=0;
int o2,n2,w;
o2=rd();n2=rd();w=rd();
for(int j=O;j>=0;j--){
for(int k=N;k>=0;k--){
int t1=j+o2,t2=k+n2;
if(t1>O)t1=O;if(t2>N)t2=N;
f[t1][t2]=min(f[t1][t2],f[j][k]+w);
}
}
}
cout<<f[O][N];
return 0;
}