二维背包---P1509 找啊找啊找GF P1509 找啊找啊找GF

题解

很明显这是一道二维背包题目

如果一个dp数组做不了,那么我们就再来一个dp数组

题目要求,花费不超过 m ,消耗人品不超过  r  ,泡到尽量多的妹子,时间尽量少

f [ i ][ j ] 花费不超过 m ,消耗人品不超过 j ,可以泡到的最多妹子数量

g [ i ][ j ] 花费不超过 m ,消耗人品不超过 j ,可以泡到最多妹子的最少时间

注意:

1. f [ i ][ j ] 可能相同但是对应的 g[ i ][ j ] 有不同,即

    二维背包---P1509 找啊找啊找GF
P1509 找啊找啊找GF

2. ans 可能相同但是对应的 g[ i ][ j ] 有不同,即

   二维背包---P1509 找啊找啊找GF
P1509 找啊找啊找GF

3.虽然上边说的差不多是一回事,但是还是提醒一句,这个人要泡到尽量多的妹子,而且他可能泡不到

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<queue>

using namespace std;

typedef long long ll;

inline int read()
{
    int ans=0;
    char last=' ',ch=getchar();
    while(ch<'0'||ch>'9') last=ch,ch=getchar();
    while(ch>='0'&&ch<='9') ans=ans*10+ch-'0',ch=getchar();
    if(last=='-') ans=-ans;
    return ans;
}

int n,m,r;
int rmb[105],rp[105],tim[105];
int f[105][105],g[105][105];
int ans=0,res=2147483645;

int main()
{
    n=read();
    for(int i=1;i<=n;i++) rmb[i]=read(),rp[i]=read(),tim[i]=read();
    m=read();r=read();
    for(int k=1;k<=n;k++)
      for(int i=m;i>=rmb[k];i--)
         for(int j=r;j>=rp[k];j--){
             if(f[i-rmb[k]][j-rp[k]]+1>f[i][j]){
                 f[i][j]=f[i-rmb[k]][j-rp[k]]+1;
                 g[i][j]=g[i-rmb[k]][j-rp[k]]+tim[k];
             }
            if(f[i-rmb[k]][j-rp[k]]+1==f[i][j]){  
                g[i][j]=min(g[i][j],g[i-rmb[k]][j-rp[k]]+tim[k]);  
            }  
            if(f[i][j]==ans) res=min(res,g[i][j]);    
if(f[i][j]>ans) ans=f[i][j],res=g[i][j];
         }
    if(res>214748364) {
        printf("0
");
        return 0;
    }
    printf("%d
",res);
    return 0;
}