• RQNOJ 57 找啊找啊找GF:01背包


    题目链接:https://www.rqnoj.cn/problem/57

    题意:

      sqybi在七夕这天太无聊了,所以他想去给自己找GF。

      总共有n个MM。

      搞定第i个MM要花费rmb[i]块大洋、rp[i]的人品、tim[i]的时间。

      现在sqybi有m块大洋、r个人品。

      问你在泡到MM的数量最多的情况下,所用的最短时间是多少。

    题解:

      表示状态:

        dp[i][j][k][p] = min cost time

        i:考虑到第i个MM

        j:花费的rmb

        k:花费的rp

        p:已经搞定的MM数量

      找出答案:

        最多找到max_gf个GF。

        ans = min dp[n][j][k][max_gf]

      如何转移:

        now: dp[i][j][k][p]

        dp[i+1][j][k][p] = min dp[i][j][k][p] (不选)

        dp[i+1][j+rmb[i]][k+rp[i]][p+1] = min dp[i][j][k][p] + tim[i] (选)

        同时每次更新max_gf的值。

      边界条件:

        dp[0][0][0][0] = 0

    AC Code:

     1 // state expression:
     2 // dp[i][j][k][p] = min cost time
     3 // i: considering ith MM
     4 // j: cost rmb
     5 // k: cost rp
     6 // p: get k GF
     7 //
     8 // find the answer:
     9 // min dp[n][0 to m][0 to r][max p]
    10 //
    11 // transferring:
    12 // now: dp[i][j][k][p]
    13 // dp[i+1][j][k][p] = min dp[i][j][k][p]
    14 // dp[i+1][j+rmb[i]][k+rp[i]][p+1] = min dp[i][j][k][p] + tim[i]
    15 // max_gf = max p
    16 //
    17 // boundary:
    18 // dp[0][0][0][0] = 0
    19 // others = -1
    20 #include <iostream>
    21 #include <stdio.h>
    22 #include <string.h>
    23 #define MAX_N 105
    24 #define MAX_M 105
    25 #define MAX_R 105
    26 #define INF 10000000
    27 
    28 using namespace std;
    29 
    30 int n,m,r;
    31 int ans;
    32 int max_gf;
    33 int rmb[MAX_N];
    34 int rp[MAX_N];
    35 int tim[MAX_N];
    36 int dp[MAX_M][MAX_R][MAX_N];
    37 
    38 void read()
    39 {
    40     cin>>n;
    41     for(int i=0;i<n;i++)
    42     {
    43         cin>>rmb[i]>>rp[i]>>tim[i];
    44     }
    45     cin>>m>>r;
    46 }
    47 
    48 void solve()
    49 {
    50     max_gf=0;
    51     memset(dp,-1,sizeof(dp));
    52     dp[0][0][0]=0;
    53     for(int i=0;i<n;i++)
    54     {
    55         for(int j=m;j>=0;j--)
    56         {
    57             for(int k=r;k>=0;k--)
    58             {
    59                 for(int p=max_gf;p>=0;p--)
    60                 {
    61                     if(dp[j][k][p]!=-1)
    62                     {
    63                         if(j+rmb[i]<=m && k+rp[i]<=r)
    64                         {
    65                             if(dp[j+rmb[i]][k+rp[i]][p+1]==-1 || dp[j+rmb[i]][k+rp[i]][p+1]>dp[j][k][p]+tim[i])
    66                             {
    67                                 dp[j+rmb[i]][k+rp[i]][p+1]=dp[j][k][p]+tim[i];
    68                                 max_gf=max(max_gf,p+1);
    69                             }
    70                         }
    71                     }
    72                 }
    73             }
    74         }
    75     }
    76     ans=INF;
    77     for(int j=0;j<=m;j++)
    78     {
    79         for(int k=0;k<=r;k++)
    80         {
    81             if(dp[j][k][max_gf]!=-1) ans=min(ans,dp[j][k][max_gf]);
    82         }
    83     }
    84 }
    85 
    86 void print()
    87 {
    88     cout<<ans<<endl;
    89 }
    90 
    91 int main()
    92 {
    93     read();
    94     solve();
    95     print();
    96 }

     

  • 相关阅读:
    Click: 命令行工具神器
    Pipenv: Python包管理神器
    如何让你的Python程序支持多语言
    Volatile变量
    简单排查java应用CPU飙高的线程问题
    java中的clone
    接口限流
    HTTP协议详解
    [转]nginx 源码学习笔记(十五)—— ngx_master_process_cycle 多进程(一)
    nginx slab内存管理
  • 原文地址:https://www.cnblogs.com/Leohh/p/7460904.html
Copyright © 2020-2023  润新知