二刷提高课,题解目录在这里— 提高课的题解目录
通过题目可知,每遇到一个精灵要么收服它,要么离开,所以是一个01背包问题
但是这里有两个限制条件,即,精灵球的个数,皮卡丘的血量
如果我们开了三维所占用的地址空间为1000 * 500 * 100=5e7,对于64mb显然会爆内存
所以这里需要二维优化,一般二维优化是将最上层的也就是第一维优化掉
注意这里皮卡丘的血量若为零那么当前若有精灵是捕捉不到的
所以我们将皮卡丘的血量-1即可
#include<iostream>
using namespace std;
const int N=1e3+10;
int a[N],b[N];
int f[1010][510];
int n,m,k;
int main()
{
cin>>m>>k>>n;
for(int i=1;i<=n;i++)cin>>a[i]>>b[i];
for(int i=1;i<=n;i++)
{
for(int j=m;j>=a[i];j--)
{
for(int u=k-1;u>=b[i];u--)
{
f[j][u]=max(f[j][u],f[j-a[i]][u-b[i]]+1);
}
}
}
cout<<f[m][k-1]<<" ";
for(int i=0;i<=k-1;i++)
{
if(f[m][i]==f[m][k-1])
{
cout<<k-i<<endl;
return 0;
}
}
return 0;
}