感觉就是分组,分组也已经分好了,但是不知道为什么最后遍历完就错了
by small_C_77777 @ 2022-05-01 15:22:26
https://www.luogu.com.cn/discuss/402676
这个应该能帮到你。
这是我的代码。
我原来也是这几个点错。原因见链接。
主要是输入时对编号理解错误
```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 23:00:51