用了01背包去做,代码如下
//P1802 5 倍经验日
#include<stdio.h>
#define ll long long
#define lose 0
#define win 1
#define use 2
int n, x;
int a[1007][3];
int b[1007][1007] = {0};
ll s;
//01背包
void dp() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= x; j++) {
if (j < a[i][use])
b[i][j] = b[i - 1][j] + a[i][lose];
else
b[i][j] = b[i - 1][j] + a[i][lose] > b[i - 1][j - a[i][use]] + a[i][win] ? b[i - 1][j] + a[i][lose] : b[i - 1][j - a[i][use]] + a[i][win];
}
}
}
int main() {
scanf("%d %d", &n, &x);
for (int i = 1; i <=n; i++) {
scanf("%d %d %d",&a[i][lose],&a[i][win],&a[i][use]);
if (a[i][use] == 0) a[i][lose] = a[i][win];//如果不需要嗑药就能打过,那就不会失败,就把成功得的经验赋值给失败得的经验
}
for (int i = 0; i <= n; i++) {
b[i][0] = b[i - 1][0] + a[i][lose];//当没有药的时候,一定会战败(不需要药的战败得分已经赋值成战胜得分)
}
dp();
printf("%lld", 5 * (ll)b[n][x]);
return 0;
}