P2430严酷的训练

传送

这个题的题干很长,长到令人恶心

这个题的p乍一看好像没有卵用,但其实他很有用(废话)。这里的“费用”不再是tw[i](wky做第i道题的时间),而是tw[p[i]](wky做第i道题所对应的知识点的时间),跳过这个坑后就套用经典的01背包代码就行了

代码如下:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int tw[50001],spw,splw,m,n,f[500001],tl[5001],p[5001],q[50001],t;//这里我们也可以很皮的用rqy和lz
int main()
{
    scanf("%d %d",&spw,&splw);
    scanf("%d %d",&m,&n);
    for(int i=1;i<=n;i++)
    {scanf("%d",&tl[i]);
    tw[i]=(splw/spw)*tl[i];
    }
    for(int i=1;i<=m;i++)
    cin>>p[i]>>q[i];
    scanf("%d",&t);
    for(int i=1;i<=m;i++)
    {
        for(int j=t;j>=tw[p[i]];j--)
        {f[j]=max(f[j],f[j-tw[p[i]]]+q[i]);
        }
    }
    printf("%d",f[t]);
}
原文地址:https://www.cnblogs.com/lcez56jsy/p/10506872.html