传送门
解题思路
很显然的一道类似01背包的dp,每个人选择打或不打。
状态转移方程为
dp[i][j]=max(dp[i-1][j]+lose[i],dp[i-1][j-num[i]]+win[i])
但这个题还是比较细节的,要注意一下几点:
- 数组要用long long,否则最后一个点会炸(因为答案最终要*5)
- 失败拿经验是不需要药的
AC代码
1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstdio> 5 #include<cstring> 6 using namespace std; 7 const int maxn=1005; 8 long long dp[maxn][maxn],win[maxn],lose[maxn],num[maxn],n,m; 9 int main() 10 { 11 cin>>n>>m; 12 for(int i=1;i<=n;i++){ 13 cin>>lose[i]>>win[i]>>num[i]; 14 } 15 for(int i=1;i<=n;i++){ 16 for(int j=0;j<=m;j++){ 17 if(j<num[i]) dp[i][j]=dp[i-1][j]+lose[i]; 18 else{ 19 dp[i][j]=max(dp[i-1][j]+lose[i],dp[i-1][j-num[i]]+win[i]); 20 } 21 } 22 } 23 cout<<dp[n][m]*5; 24 return 0; 25 }