bailian4102:宠物小精灵之收服(二维费用的01背包)

来源:互联网 发布:小学英语四年级的软件 编辑:程序博客网 时间:2024/04/27 17:04

dp[i][j]表示扔i个球,皮卡丘损失j体力时所能抓到的最大精灵数。相当于二维费用的01背包。最后按皮卡丘损失体力从小到大扫一下,为了找最优解时皮卡丘剩余体力的最大值。

#include <cstdio>#include <cstring>inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();    return x*f;}inline int max(int x,int y){return x>y?x:y;}int n,m,w[102],v[102],num=0,dp[1000][500],ans=0;int main(){//  freopen("a.in","r",stdin);    n=read();m=read();int kk=read();    while(kk--){        int x=read(),y=read();        if(x>n||y>=m) continue;        w[++num]=x;v[num]=y;    }    for(int i=1;i<=num;++i)        for(int j=n;j>=w[i];--j)            for(int k=m-1;k>=v[i];--k)                dp[j][k]=max(dp[j][k],dp[j-w[i]][k-v[i]]+1);    for(int i=1;i<m;++i)        if(dp[n][i]>dp[n][ans]) ans=i;    printf("%d %d",dp[n][ans],m-ans);    return 0; }