20分求助 更新dp数组循环的时候为什么不能分别加输的和赢的
查看原帖
20分求助 更新dp数组循环的时候为什么不能分别加输的和赢的
170047
小渣青999楼主2020/8/7 18:11
#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;
}
2020/8/7 18:11
加载中...