#include<iostream> #include<iomanip> #include<cstring> #include<string> #include<algorithm> #include<cstdio> #include<cmath> using namespace std; int n,m,F[40010],a[40010]; int V[70],W[70],Q[70]; void init() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d%d",&V[i],&W[i],&Q[i]); W[i]*=V[i]; } } int main() { init(); for(int i=1;i<=m;i++) if(!Q[i]) { for(int j=1;j<=V[i];j++) a[j]=0; for(int j=V[i];j<=n;j++) a[j]=F[j-V[i]]+W[i];//先在临时a数组中做对于当前主件的完全背包 for(int j=1;j<=m;j++) if(Q[j]==i)//当该物件为当前主件的附件 for(int k=n;k>=V[i]+V[j];k--) a[k]=max(a[k],a[k-V[j]]+W[j]);//做附件的完全背包 for(int j=V[i];j<=n;j++) F[j]=max(F[j],a[j]);//将a数组中的临时值赋值给f } cout<<F[n]<<endl; return 0; }
OJ-1278【金明的预算方案】 依赖型背包
最新推荐文章于 2023-11-10 09:27:20 发布
经典背包类问题,当分的组中有一个作主件(只有装了主件才能装该组物件的其他物件)时,DP的思路就必须更加更加的清晰与结构化,明白每一步都做了什么。要不就像我开始一样Orz了。
注释版Code: