有4个测试点没过,请问代码错在哪里?
查看原帖
有4个测试点没过,请问代码错在哪里?
574847
tqychy楼主2022/1/25 23:19
#include<stdio.h>
int max(int a,int b);
int main()
{int i=0,j=0,n=0,m=0,tv=0,tq=0,tp=0,cntm=0,cnts=0;
scanf("%d %d",&m,&n);//m和n和题目是反的。 
int mainw[1+n];
int mainv[1+n];
int cntsides[1+n];
int sidew[1+n][2];//第二维0表示第一个附件,1表示第二个附件。
int sidev[1+n][2];
int dp[1+m];
for(i=0;i<=n;i++)
{
	mainw[i]=0;//主件的代价。 
	mainv[i]=0;//主件的价值。 
	cntsides[i]=0;//主件的附件数量。 
	for(j=0;j<=1;j++)
	{
		sidew[i][j]=0;//附件的代价。
		sidev[i][j]=0;//附件的价值。
	}
}
for(i=0;i<n;i++)
{
	scanf("%d %d %d",&tv,&tp,&tq);
	if(tq==0)
	{
		cntm++;
		mainw[cntm]=tv;
		mainv[cntm]=tp*tv;
	}
	else
	{
		sidew[tq][cntsides[tq]]=tv;
		sidev[tq][cntsides[tq]]=tp*tv;
		cntsides[tq]++;
	}
}
for(i=0;i<=m;i++){dp[i]=0;}
i=1;
while(mainv[i]!=0)
{
	for(j=m;j>0;j--)
	{
		if(j>=mainw[i]){dp[j]=max(mainv[i]+dp[j-mainw[i]],dp[j]);}
		if(cntsides[i]>0&&j>=sidew[i][0]+mainw[i])
		{
			dp[j]=max(sidev[i][0]+mainv[i]+dp[j-mainw[i]-sidew[i][0]],dp[j]);
		}
		if(cntsides[i]>1&&j>=sidew[i][1]+mainw[i])
		{
			dp[j]=max(dp[j],sidev[i][1]+mainv[i]+dp[j-mainw[i]-sidew[i][1]]);
		}
		if(cntsides[i]>1&&j>=sidew[i][0]+sidew[i][1]+mainw[i])
		{
			dp[j]=max(sidev[i][0]+sidev[i][1]+mainv[i]+dp[j-mainw[i]-sidew[i][1]-sidew[i][0]],dp[j]);
		}
    }
    i++;
}
printf("%d",dp[m]);
return 0;
}
int max(int a,int b)
{
	if(b>a){return b;}
	return a;
}
2022/1/25 23:19
加载中...