分析:
背包,写的时候记住不要手残
这里写代码片#include#include #include using namespace std;const int N=100005;int f[32005];int w[N],v[N],tot=0;int fj[N][2];bool p[N];int n,m;int main(){ scanf("%d%d",&n,&m); memset(p,1,sizeof(p)); for (int i=1;i<=m;i++) { int u,e,z; scanf("%d%d%d",&u,&e,&z); w[i]=u; v[i]=e*u; if (z) //附件 p[i]=0,fj[z][fj[z][0]==0 ? 0:1]=i; } for (int i=1;i<=m;i++) for (int j=n;j>=w[i];j--) if (p[i]) { f[j]=max(f[j],f[j-w[i]]+v[i]); if (fj[i][0]&&j>=w[i]+w[fj[i][0]]) f[j]=max(f[j],f[j-w[i]-w[fj[i][0]]]+v[i]+v[fj[i][0]]); if (fj[i][1]&&j>=w[i]+w[fj[i][1]]) f[j]=max(f[j],f[j-w[i]-w[fj[i][1]]]+v[i]+v[fj[i][1]]); if (fj[i][0]&&fj[i][1]&&j>=w[i]+w[fj[i][0]]+w[fj[i][1]]) f[j]=max(f[j],f[j-w[i]-w[fj[i][0]]-w[fj[i][1]]]+v[i]+v[fj[i][0]]+v[fj[i][1]]); } printf("%d",f[n]); return 0;}