奇怪的码风,我刚AC看了你的WA代码又迷惑了
by FantasyB @ 2022-04-11 21:43:55
咱俩应该是一样的错,我把第一个WA的点下载下来跑了一下,我的结果是7200,你的也是,而正解是7430,我看了好半天没看明白为啥能拿到7430
后来突然想明白了,是题理解错了。
我大概人瞅了一眼的的输入部分的代码,和我一样统计了有几个主要物品。但是这个题目最坑的是:**并不是第几个出现的主要物品编号是几,而是第几行出现的主要物品编号是几!**
也就是说,主要物品并不是按照顺序给出的,中间可能有空。
by JCLinux @ 2022-04-12 07:58:56
@[JCLinux](/user/448502)
我的也是这个问题,WA 3 7 8 9
看了您的才改过来
错误代码
```cpp
#include<bits/stdc++.h>
using namespace std;
int n,m,N;
int V[150][3],P[150][3];
int dp[32005];
int main()
{
scanf("%d%d",&n,&m);
int v,p,q;
for(int i = 1;i <= m;i ++)
{
scanf("%d%d%d",&v,&p,&q);
if(q == 0){
V[++ N][0] = v;
P[N][0] = p;
}else{
if(V[q][1] == 0){
V[q][1] = v;
P[q][1] = p;
}else{
V[q][2] = v;
P[q][2] = p;
}
}
}
for(int i = 1;i <= N;i ++)
{
for(int j = n;j >= V[i][0] && V[i][0];j -= 10)
{
dp[j] = max(dp[j],dp[j - V[i][0]] + V[i][0] * P[i][0]);
// printf("dp[%d] = %d\n",j,dp[j]);
if(V[i][1] && j >= V[i][0] + V[i][1]){
dp[j] = max(dp[j],dp[j - V[i][0] - V[i][1]] + V[i][0] * P[i][0]+ V[i][1] * P[i][1]);
}
if(V[i][2] && j >= V[i][0] + V[i][2]){
dp[j] = max(dp[j],dp[j - V[i][0] - V[i][2]] + V[i][0] * P[i][0]+ V[i][2] * P[i][2]);
}
if(V[i][2] && V[i][1] && j >= V[i][0] + V[i][1] + V[i][2]){
dp[j] = max(dp[j],dp[j - V[i][0] - V[i][1] - V[i][2]] + V[i][0] * P[i][0]+ V[i][1] * P[i][1] + V[i][2] * P[i][2]);
}
}
}
printf("%d",dp[n]);
return 0;
}
```
正确代码:
```cpp
#include<bits/stdc++.h>
using namespace std;
int n,m,N;
int V[150][3],P[150][3];
int dp[32005];
int main()
{
scanf("%d%d",&n,&m);
int v,p,q;
for(int i = 1;i <= m;i ++)
{
scanf("%d%d%d",&v,&p,&q);
if(q == 0){
V[i][0] = v;
P[i][0] = p;
}else{
if(V[q][1] == 0){
V[q][1] = v;
P[q][1] = p;
}else{
V[q][2] = v;
P[q][2] = p;
}
}
}
for(int i = 1;i <= m;i ++)
{
for(int j = n;j >= V[i][0] && V[i][0];j -= 10)
{
dp[j] = max(dp[j],dp[j - V[i][0]] + V[i][0] * P[i][0]);
// printf("dp[%d] = %d\n",j,dp[j]);
if(V[i][1] && j >= V[i][0] + V[i][1]){
dp[j] = max(dp[j],dp[j - V[i][0] - V[i][1]] + V[i][0] * P[i][0]+ V[i][1] * P[i][1]);
}
if(V[i][2] && j >= V[i][0] + V[i][2]){
dp[j] = max(dp[j],dp[j - V[i][0] - V[i][2]] + V[i][0] * P[i][0]+ V[i][2] * P[i][2]);
}
if(V[i][2] && V[i][1] && j >= V[i][0] + V[i][1] + V[i][2]){
dp[j] = max(dp[j],dp[j - V[i][0] - V[i][1] - V[i][2]] + V[i][0] * P[i][0]+ V[i][1] * P[i][1] + V[i][2] * P[i][2]);
}
}
}
printf("%d",dp[n]);
return 0;
}
```
就是输入的部分改一下
by __Shao__ @ 2022-06-06 22:54:34