首页 > 其他 > 详细

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

时间:2019-12-09 18:44:16      阅读:82      评论:0      收藏:0      [点我收藏+]

P1509 找啊找啊找GF

题解

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

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

 

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

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

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

 

注意:

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

    技术分享图片

 

 

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

   技术分享图片

 

 

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\n");
        return 0;
    }
    printf("%d\n",res);
    return 0;
}

 

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

原文:https://www.cnblogs.com/xiaoyezi-wink/p/12012134.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!