组合背包
#include<iostream> using namespace std; int v[9999]; int w[9999]; int k[9999]; int f[99999]; int n,m; int t=0; int s[9999][10]; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int x; scanf("%d%d%d",&v[i],&x,&k[i]); w[i]=x*v[i]; if(k[i]!=0)//如果是附件的话,才放 s[k[i]][++s[k[i]][0]]=i; } for(int i=1;i<=m;i++) if(!k[i]) { for(int j=n;j>=0;j--) { if(j-v[i]>=0) f[j]=max(f[j-v[i]]+w[i],f[j]); if(j-v[i]-v[s[i][1]]>=0) f[j]=max(f[j-v[i]-v[s[i][1]]]+w[i]+w[s[i][1]],f[j]); if(j-v[i]-v[s[i][2]]>=0) f[j]=max(f[j-v[i]-v[s[i][2]]]+w[i]+w[s[i][2]],f[j]); if(j-v[i]-v[s[i][2]]-v[s[i][1]]>=0) f[j]=max(f[j-v[i]-v[s[i][2]]-v[s[i][1]]]+w[i]+w[s[i][2]]+w[s[i][1]],f[j]); } } printf("%d",f[n]); return 0; }
来源:https://www.cnblogs.com/wspl98765/p/6819896.html