zoukankan      html  css  js  c++  java
  • 【noi 2.6_4978】宠物小精灵之收服(DP)

    题意:小智有N个精灵球,皮卡丘有M的初始体力,有K个野生小精灵。要收服尽可能多的野生小精灵,并使皮卡丘的剩余体力最大。

    解法:01背包问题,增多一维来存第二个条件。f[i][j][k]表示抓前i个野生小精灵,用了j个精灵球,耗费了k的体力时能抓的最多的小精灵数。(我把[i]的那维简化掉了,PG里的m代替N,v代替M,n代替K。)

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<iostream>
     5 using namespace std;
     6 #define INF 1e6
     7 
     8 int a[110],b[110];
     9 int f[1010][510];
    10 
    11 int main()
    12 {
    13     int m,v,n;
    14     scanf("%d%d%d",&m,&v,&n);
    15     for (int i=1;i<=n;i++)
    16        scanf("%d%d",&a[i],&b[i]);
    17     int mx=0,ans=0;
    18     memset(f,0,sizeof(f));
    19     for (int i=1;i<=n;i++)
    20      for (int j=m;j>=a[i];j--)
    21       for (int k=v;k>=b[i];k--)
    22       {
    23         f[j][k]=max(f[j][k],f[j-a[i]][k-b[i]]+1);
    24         if (f[j][k]>mx||(f[j][k]==mx && v-k>ans)) mx=f[j][k],ans=v-k;
    25       }
    26     if (!mx) ans=v;
    27     printf("%d %d
    ",mx,ans);
    28     return 0;
    29 }

     

     

  • 相关阅读:
    算法作业实验三
    牛客练习赛53 B 美味果冻
    牛客练习赛53 C 富豪凯匹配串
    bitmat
    牛客挑战赛33 B 鸽天的放鸽序列
    树状数组
    线段树
    2019牛客国庆集训派对day7 A 2016
    背包
    作业三 -并查集
  • 原文地址:https://www.cnblogs.com/konjak/p/5936848.html
Copyright © 2011-2022 走看看