Vijos1313 金明的预算方案
来源:互联网 发布:熊出没知夏日连连看 编辑:程序博客网 时间:2024/05/21 05:38
题目大意:给定物品数与总钱数,物品分为主件与附件,想选附件必须选主件,求最大能得到多少给定价值。
思路:绝对是有依赖的背包问题,可将其转化为01背包问题。对于每一个物品集合,取不选、只选主件、多选一个附件、多选两个附件的最大值即可。要注意的一点是,要预处理将属于同一个集合的物品(即主件及其附件)归到一起。
代码如下:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<map>using namespace std;const int maxm=65;const int maxv=32005;struct node{ int v,p; node(int v=0,int p=0):v(v),p(p){}};int n,m,tot=0;int f[maxv],po[maxm];node sub[maxm][5];map<int,int> has;void init(){ scanf("%d%d",&n,&m); memset(f,0,sizeof(f)); memset(po,0,sizeof(po)); for (int i=1;i<=m;++i) { int v,p,q; scanf("%d%d%d",&v,&p,&q); if (q==0) { tot++; has[i]=tot; sub[tot][0]=node(v,p); } else { po[has[q]]++; sub[has[q]][po[has[q]]]=node(v,p); } }}void dp(){ int i,j,totv,totvp; for (i=1;i<=tot;++i) for (j=n;j>=0;--j) { if (j-sub[i][0].v>=0) { f[j]=max(f[j],f[j-sub[i][0].v]+sub[i][0].v*sub[i][0].p); } else continue; totv=sub[i][0].v; totvp=sub[i][0].v*sub[i][0].p; for (int a=1;a<=po[i];++a) { totv+=sub[i][a].v; totvp+=sub[i][a].v*sub[i][a].p; if (j-sub[i][0].v-sub[i][a].v>=0) f[j]=max(f[j],f[j-sub[i][0].v-sub[i][a].v]+sub[i][0].v*sub[i][0].p+sub[i][a].v*sub[i][a].p); } if (j-totv>=0) f[j]=max(f[j],f[j-totv]+totvp); } printf("%d\n",f[n]);}int main(){ init(); dp(); return 0;}
0 0
- Vijos1313 金明的预算方案
- 金明的预算方案
- 金明的预算方案
- 金明的预算方案
- 金明的预算方案
- 金明的预算方案
- 金明的预算方案
- 金明的预算方案
- 金明的预算方案
- 金明的预算方案
- 金明的预算方案
- RQ_6_金明的预算方案
- 【金明的预算方案】解题报告
- NOI2006:金明的预算方案
- rq06金明的预算方案题解
- rqnoj-6-金明的预算方案
- Sicily 1346 金明的预算方案
- 金明的预算方案_DP
- SQlite常用语句
- swift--枚举
- Android Studio 插件--postfix
- 安卓:handler解析json新闻,显示图片,标题,内容(未判断网络连接状态)
- Mysql查看表的结构相关命令
- Vijos1313 金明的预算方案
- 生成伪随机整数rand()
- 使用spool和sqlldr导表的shell脚本
- ListFragment+CheckedTextView和ListFragment+CheckBox两种多选效果
- Android中Thread和Service的区别(两篇不错的讲解)
- dig---优秀域名故障排查工具
- Hbase属性说明及与关系型数据库区别
- (小结)第三章:选择
- Linux管道编程实例 http://blog.csdn.net/pcliuguangtao/article/details/6453743