Luogu P1802 5倍经验日_KEY
·背包
这可以说是一道背包的变形。
首先需要考虑到的是如何将ta转换为一个正常 的背包。
这些数据有一个让我们都十分不爽的地方就是有两个值。
所以我们就设置一个基准值,将失败的经验值当做基准值,这样就只剩一个win-lose的“背包价值”了。
接下来即进行0-1背包操作
最后输出时将减去的lose_sum加上,再乘5就好了。
code:
#include <cstdio> #include <cctype> #define C c = getchar ( ) using namespace std; inline int read() { static char c; while(!isdigit(C));int x=c-'0'; while(isdigit(C))x=x*10+c-'0'; return x; } inline int max(int x,int y){return x>y?x:y;} int n,x,win,lose,sum; int v[1001],c[1001]; long long f[1001]; int main() { n=read(),x=read(); for(int i=1;i<=n;i++) { lose=read(),win=read(),c[i]=read(); v[i]=win-lose,sum+=lose; } for(int i=1;i<=n;i++) for(int j=x;j>=c[i];j--) f[j]=max(f[j-c[i]]+v[i],f[j]); printf("%lld",(f[x]+sum)*5); return 0; }
O(N*M)