#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{
int x,y,u; //x:输掉的经验 y:赢了的经验 u:获胜需要的药水个数
}s[1010];
long long int ans;
long long int dp[1000100];
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++) cin>>s[i].x>>s[i].y>>s[i].u;
for(int i=0;i<n;i++)
for(int j=m;j>=s[i].u;j--)
{
dp[j]=max(dp[j]+s[i].x,dp[j-s[i].u]+s[i].y);
}
cout<<dp[m]*5;
return 0;
}
这样的代码20分,后来改成下面的代码先都加上输的,再对用药水的部分加上赢和输的差值,就AC了,但我不明白上面的代码哪里错了呢
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{
int x,y,u;
}s[1010];
long long int ans;
long long int dp[1000100];
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++) cin>>s[i].x>>s[i].y>>s[i].u;
for(int i=0;i<n;i++) ans+=s[i].x;
for(int i=0;i<n;i++)
for(int j=m;j>=s[i].u;j--)
{
dp[j]=max(dp[j],dp[j-s[i].u]+s[i].y-s[i].x);
}
cout<<(dp[m]+ans)*5;
return 0;
}