OJ-1278【金明的预算方案】 依赖型背包

经典背包类问题,当分的组中有一个作主件(只有装了主件才能装该组物件的其他物件)时,DP的思路就必须更加更加的清晰与结构化,明白每一步都做了什么。要不就像我开始一样Orz了。

注释版Code:

#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; }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值