有4个测试点没过,请问代码错在哪里?

P1064 [NOIP2006 提高组] 金明的预算方案

奇怪的码风,我刚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


|