这个题的题干很长,长到令人恶心
这个题的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