hdu 3449 有依赖的背包

来源:互联网 发布:当当和淘宝买书哪个好 编辑:程序博客网 时间:2024/04/27 22:00

背景:1——TL按照背包九讲的把没一个依赖组转用01背包转化成物品集合,然后又用分组背包的方法来做,超时。优化无果,借鉴别人思路ac。

正确写法思路:先不管必须选盒子这个前提,按照01背包的思想把物品选一次到thing[]数组中,然后再把再强项对每个数据都买盒子,这样thing中只有thing[box....v]能买起盒子,且thing[k]=thing[k-box]+0 ,盒子的价值是0.所以转移方程:F[j]=max{F[j],thing[k-box]}  (F[j]表示不选盒子和盒子里的物品的价值,thing[k-box]表示选择盒子和盒子内的物品所能达到的最大价值)

题目注解见代码:

#include <iostream>#include<cstdio>#include<cstring>#define INF 100009using namespace std;int thing[INF],F[INF];int n,v,box,mi,co[20],wo[20],sum_box;int main(void){    while(~scanf("%d%d",&n,&v)){        memset(F,0,sizeof(F));        for(int i=0;i < n;i++){            scanf("%d%d",&box,&mi);            for(int j=0;j < mi;j++){                scanf("%d%d",&co[j],&wo[j]);            }            memcpy(thing,F,sizeof(F));    //继承上次的状态。            for(int i=0;i < mi;i++){    //在不考虑选择盒子的情况下,01背包式自由选择附件。                for(int j=v;j >= co[i];j--){                    thing[j]=max(thing[j],thing[j-co[i]]+wo[i]);                }            }            for(int i=0;i <= v;i++) F[i]=max(F[i],thing[i-box]);  /*减去盒子费用的转移:这里其实是把,自由选择下的F[box...v],当做选了盒子之后的F[1...v-box]        }                                                           这样就能满足:先必须选择一个盒子,再选择用01背包的方式选择一个物品的条件了*/        printf("%d\n",F[v]);    }    return 0;}


将附件集合转化为物品组的超时代码:

#include <iostream>#include<cstdio>#include<cstring>#define INF 100009using namespace std;int thing[INF],F[INF];int n,v,box,mi,co[20],wo[20],sum_box;void zeroonebag(void){     for(int j=0;j < mi;j++){         for(int k=sum_box;k >= co[j];k--){             thing[k]=max(thing[k],thing[k-co[j]]+wo[j]);         }     }}int main(void){    while(~scanf("%d%d",&n,&v)){        memset(F,0,sizeof(F));        for(int i=0;i < n;i++){            scanf("%d%d",&box,&mi);            sum_box=0;            for(int j=0;j < mi;j++){                scanf("%d%d",&co[j],&wo[j]);                sum_box+=co[j];            }            sum_box=min(v-box,sum_box);            memset(thing,0,sizeof(thing));            if(box >= v) continue;            zeroonebag();    //用01背包将附件集合转化为物品组。            for(int j=v;j >= 1;j--){                for(int k=0;k <= sum_box;k++){                    if(j-box-k >= 0) F[j]=max(F[j],F[j-box-k]+thing[k]);                }            }        }        printf("%d\n",F[v]);    }    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 两周宝宝剧烈运动后咳嗽怎么办 bra的M有点紧L有点宽怎么办 穿吊带总是会露出来左胸罩杯怎么办 生小孩后腰部有一圈黑色勒痕怎么办 新买的饮水机热水口出水小怎么办 新买的饮水机热水口不出水怎么办 平胸没有适合自己的内衣怎么办 售楼小姐穿坏的丝袜都怎么办了 蛋白粉一天喝十克补不起来怎么办 跑步时没有卸妆毛孔堵塞了怎么办 自己做的葡萄酒太甜了怎么办 健身馆碰到一个帅的健身教练怎么办 随着年龄的增长脖子越来越短怎么办 安装软件时解析包出现问题怎么办 鼻子吸进去的气往嘴巴里怎么办 做完瑜伽之后大腿后侧特别紧怎么办 刚下生小狗腿后腿站不起来怎么办 脚被凳子压到了流血了怎么办还很痛 小狗脚被凳子压出血了怎么办 怀孕8个月脐带绕颈一周怎么办 练完瑜伽大腿两侧肌肉麻木怎么办 突然吃了辣火锅肚子烫怎么办 副鼻窦炎鼻头顶痛鼻子臭怎么办 一岁宝宝夜里睡觉不踏实怎么办 分手一个月了还是放不下前任怎么办 当晚上遇到烦心事睡不着该怎么办 为什么白天太累晚上就睡不着怎么办 白天走累的脚痛晚上睡不着怎么办 1岁宝宝感冒咳嗽流泪流鼻涕怎么办 宝宝不含母乳只吃奶瓶怎么办 宝宝习惯奶嘴不咬妈妈的乳头怎么办 我的乳晕和私处色素沉着怎么办 双盘打坐膝痛腿脚心处紫青怎么办? 双盘打坐两膝盖不能着地怎么办? 做完蹲起之后腿疼的受不了怎么办 孩子游泳学不会不想去了怎么办 自由泳打腿走水但水花大怎么办 老师上课发现学生课上自慰怎么办 生完孩子腿粗屁股大怎么办 产后42天检查子宫偏大怎么办 崇拜瑜伽老师喜欢上他了怎么办