状态转移方程:
dp[i][j]=max(dp[i][j],dp[i-1][j]+lose[i]);//不用药水的失败转移
if(j>=use[i])dp[i][j]=max(dp[i][j],dp[i-1][j-use[i]]+win[i]);//使用药水的成功转移
AC代码如下:
#include <bits/stdc++.h>
#define maxn 1010
#define LL long long
using namespace std;
int n,m;
int lose[maxn],win[maxn],use[maxn];
int dp[maxn][maxn];
int main(){
int i,j,k;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)scanf("%d%d%d",&lose[i],&win[i],&use[i]);
for(i=1;i<=n;i++)
for(j=0;j<=m;j++){
dp[i][j]=max(dp[i][j],dp[i-1][j]+lose[i]);//不用药水的失败转移
if(j>=use[i])dp[i][j]=max(dp[i][j],dp[i-1][j-use[i]]+win[i]);//使用药水的成功转移
}
printf("%lld\n",(LL)dp[n][m]*5);//此处int会溢出,比较隐蔽。
return 0;
}