[CODEVS] 5056 潜水员

二维背包问题,实现起来有一些小细节

#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;
}

未经许可,禁止搬运。
原文地址:https://www.cnblogs.com/ghostcai/p/9784100.html