5倍经验日
洛谷P1802 5倍经验日
简单的背包,因为输了也有经验,所以预处理求和,f[i]+=sum,并在此基础上01背包,c[i]为差值,注意赋值时,i从0开始,背包的声韵体积可以为0.
#include<bits/stdc++.h> #define inf 99999999 using namespace std; void in(long long &x) { long long y=1; char c=getchar();x=0; while(c<'0'||c>'9') { if(c=='-') y=-1; c=getchar(); } while(c<='9'&&c>='0')x=x*10+c-'0',c=getchar(); x*=y; } long long n,v; long long f[1010],c[1010],w[1010]; long long sum; int main() { in(n),in(v); long long x,y; for(long long i=1;i<=n;i++) { in(x),in(y),in(w[i]); sum+=x; if(y<x) { c[i]=0; w[i]=inf; } else c[i]=y-x; } for(long long i=0;i<=v;i++) { f[i]=sum; } for(long long i=1;i<=n;i++) for(long long j=v;j>=w[i];j--) f[j]=max(f[j],f[j-w[i]]+c[i]); cout<<f[v]*5; return 0; }