下载第一个检测点,调试是对的,交的时候是0分
查看原帖
下载第一个检测点,调试是对的,交的时候是0分
1504757
ACMyGo楼主2024/12/25 20:12

用了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;
}
2024/12/25 20:12
加载中...