#include<iostream>
#include<cstring>
using namespace std;
const int N=1e3+10;
const int M=5e2+10;
const int K=1e2+10;
int dp[2][N][M];
//dp[i][j][k]:
//考虑前i个精灵,当前精灵球为j,当前体力值为k ---> 所能抓捕的最多精灵数量
int x[N],y[M];
int n,m,k;
int main()
{
cin>>n>>m>>k;
//n:精灵球数量 ; m:初始体力值 ; k:野生小精灵数量
for(int i=1;i<=k;i++)
cin>>x[i]>>y[i];
for(int i=0;i<=n;i++)
dp[0&1][i][0]=-0x3f3f3f3f;
//不合法的情况
for(int i=1;i<=k;i++)
{
for(int j=0;j<=n;j++)
{
for(int k=0;k<=m;k++)
{
if(!k)
{
dp[i&1][j][k]=-0x3f3f3f3f;
continue;
}
if(dp[i&1][j][k]<dp[i-1&1][j][k])
{
dp[i&1][j][k]=max(dp[i&1][j][k],dp[i-1&1][j][k]);
}
//不抓第i个
if(j-x[i]>=0&&k-y[i]>=0)
{
if(dp[i&1][j][k]<dp[i-1&1][j-x[i]][k-y[i]]+1)
{
dp[i&1][j][k]=max(dp[i&1][j][k],dp[i-1&1][j-x[i]][k-y[i]]+1);
}
}
}
}
}
cout<<dp[k&1][n][m];
int t=m;
while(dp[k&1][n][t]==dp[k&1][n][m])
t--;
t++;
cout<<" "<<m-t+1<<endl;
}
AcWing 1022.宠物小精灵之收服
最新推荐文章于 2023-12-02 12:20:28 发布