|
- #include <cstdio>
- #include <algorithm>
- #include <iostream>
- #include <cmath>
- #include <cstring>
- #include <set>
- using namespace std;
- int main()
- {
- int f[30005]={0},v[70]={0},fu[70][4]={0},w[70]={0},i,w_all,n;
- scanf("%d %d",&w_all,&n);
- w_all=w_all/10;
- for(i=1;i<=n;i++)
- {
- int q,w2;
- scanf("%d %d %d",&w[i],&q,&w2);
- w[i]=w[i]/10;
- v[i]=q*w[i];
- if(w2>0)
- {
- fu[w2][3]++;
- fu[w2][fu[w2][3]]=i;
- fu[i][0]=-1;
- }
- }
- for(i=1;i<=n;i++)
- {
- if(fu[i][0]==-1) continue;
- for(int j=w_all;j>=w[i];j--)
- {
- f[j]=max(f[j],f[j-w[i]]+v[i]);
- if(fu[i][3]==1)
- {
- if(j-w[i]-w[fu[i][1]]>=0)
- f[j]=max(f[j],f[j-w[i]-w[fu[i][1]]]+v[i]+v[fu[i][1]]);
-
- }
- if(fu[i][3]==2)
- {
- if(j-w[i]-w[fu[i][1]]>=0)
- f[j]=max(f[i],f[j-w[i]-w[fu[i][1]]]+v[i]+v[fu[i][1]]);
- if(j-w[i]-w[fu[i][2]]>=0)
- f[j]=max(f[j],f[j-w[i]-w[fu[i][2]]]+v[i]+v[fu[i][2]]);
- if(j-w[i]-w[fu[i][1]]-w[fu[i][2]]>=0)
- f[j]=max(f[j],f[j-w[i]-w[fu[i][2]]-w[fu[i][1]]]+v[fu[i][2]]+v[i]+v[fu[i][1]]);
- }
- }
- }
- printf("%d",f[w_all]*10);
- return 0;
- }
复制代码 |
|