最新要闻
- 未支付2094万美元利息 远洋集团一票据因违约停牌
- 白玉观音吊坠大中小号
- 江苏大丰龙卷风灾害已致2死15伤 灾后恢复重建工作正有序开展
- 盖尔加朵回应出演下一任《007》:感觉空间很大
- 2023年一级造价师考试报名入口
- 年内开工!襄阳→宜昌1.5小时
- 红蓝3d电影下载迅雷(3d电影下载迅雷)
- 18秒就能充满电?!再也不用担心出门手机没电了
- 离谱!男子吃菌产生驾车撞人幻觉后自首 结果虚惊一场
- 钱包预警!盘点今年还未发售的知名大作
- 汽车整车股震荡走低 多股跌超4%
- 宁波元恒再生资源有限公司(关于宁波元恒再生资源有限公司简述)
- 全球施工忙!徐工“明星大白”尽情演绎“硬核大片”
- 美媒:证据显示,特朗普团队与科菲县投票系统遭入侵直接相关
- 日本开发出加热平整半导体基板表面的方法
- 小米智能相册人物照片过少
广告
手机
上饶新闻上饶之窗(上饶新闻网)
内马尔身价变化:加盟巴萨时5000万欧,在巴黎最高达到1.8亿
- 上饶新闻上饶之窗(上饶新闻网)
- 内马尔身价变化:加盟巴萨时5000万欧,在巴黎最高达到1.8亿
- Mysteel
- 黄冈疾控启用2个博士工作室,人才培养迎来新突破
- 暑假旅游市场回暖 酒店房源“紧俏”价格上涨
- 搜狗输入法快捷键怎么设置 如何设置快捷键 搜狗输入法中怎么设置快捷键
家电
[动态规划第一节]背包问题汇总
(资料图片仅供参考)
背包问题
- 动态规划思路:
状态表示 f(i, j)
- 状态由几维表示
- 表示的集合是什么
- 所有选法
- 选法条件
- 只考虑前i个物品
- 总体积 <= j
- 集合的属性是什么
- 最大值
- 最小值
- 元素的数量
- 表示的集合是什么
- 状态由几维表示
状态计算
- 集合的划分 f(i, j)
- 不含第i个物品
- f(i - 1, j)
- 包含第i个物品
- f(i - 1, j - vi) 已知第i个物品必选,那么只要保证前i-1个物品为最大值
- 不含第i个物品
- 集合的划分 f(i, j)
01背包
- 每件物品最多取一次
- 朴素代码:
const int N = 1e3 + 10;int f[N][N], v[N], w[N];int n, m;int main(){ cin >> n >> m; for(int i = 1; i <= n; ++ i) cin >> v[i] >> w[i]; //f[1~n][0] = f[0][1~m] = 0; for(int i = 1; i <= n; ++ i) //遍历物品 for(int j = 1; j <= m; ++ j){ //遍历容量 f[i][j] = f[i - 1][j]; //不选第i个物品 if(j >= v[i]) f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]); //选第i个物品 } cout << f[n][m]; return 0;}
- 优化:
- 用滚动数组优化
- 因为第i层总是由第i-1层来更新,不会用到1~i-2层,因此只用一维数组f[N]即可自我更新,f[j]表示不超过容量j的最大价值
- 第i个物品不取,第i层与第i-1层的总价值不变,因此可以不用更新,\(f[i][j] = f[i - 1][j]\) 这句话可删去
- 第i个物品取,因此要用i-1层更新第i层,\(f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i])\) 并且总是用小容量的价值更新大容量的价值,若从小往大更新,那么小容量的价值优先被更新到第i层,大容量的价值依据小容量的价值更新时,使用的价值不再是第i-1层,所以容量要从大往小更新
- 代码:
const int N = 1e3 + 10;int f[N], v[N], w[N];int n, m;int main(){ cin >> n >> m; for(int i = 1; i <= n; ++ i) cin >> v[i] >> w[i]; //f[0] = 0; for(int i = 1; i <= n; ++ i) //遍历物品 for(int j = m; j >= v[i]; -- j) //从小往大遍历容量 f[j] = max(f[j], f[j - v[i]] + w[i]); //选第i个物品 cout << f[m]; return 0;}
完全背包
- 每件物品可取无限次
- 朴素代码:
const int N = 1e3 + 10;int f[N][N], w[N], v[N];int n, m;int main(){ cin >> n >> m; for(int i = 1; i <= n; ++ i) cin >> v[i] >> w[i]; for(int i = 1; i <= n; ++ i) //遍历物品 for(int j = 1; j <= m; ++ j) //遍历容量 for(int k = 0; k * v[i] <= j; ++ k) //遍历个数 f[i][j] = max(f[i][j], f[i - 1][j - k * v[i]] + k * w[i]); cout << f[n][m]; return 0;}
- 时间优化:
- \(f[i][j] = max(f[i - 1][j],f[i - 1][j - v] + w,f[i-1][j-2v]+2w,f[i-1][j-3v]+3w,...,f[i-1][j-kv]+kw)\)
- \(f[i][j-v]=max(f[i-1][j-v],f[i-1][j-2v]+w,f[i-1][j-3v]+w,...,f[i-1][j-kv]+(k-1)w,f[i-1][j-(k+1)v]+kw)\)
- 发现: \(f[i][j]=max(f[i-1][j],f[i][j-v]+w)\)
- 代码:
const int N = 1e3 + 10;int f[N][N], w[N], v[N];int n, m;int main(){ cin >> n >> m; for(int i = 1; i <= n; ++ i) cin >> v[i] >> w[i]; for(int i = 1; i <= n; ++ i) //遍历物品 for(int j = 1; j <= m; ++ j){ //遍历容量 f[i][j] = f[i - 1][j]; //第i个物品不选 if(j >= v[i]) f[i][j] = max(f[i][j], f[i][j - v[i]] + w[i]);//第i个物品选 } cout << f[n][m]; return 0;}
- 时空优化:
- 滚动数组优化
- 代码:
const int N = 1e3 + 10;int f[N], w[N], v[N];int n, m;int main(){ cin >> n >> m; for(int i = 1; i <= n; ++ i) cin >> v[i] >> w[i]; for(int i = 1; i <= n; ++ i) //遍历物品 for(int j = v[i]; j <= m; ++ j) //遍历容量 f[j] = max(f[j], f[j - v[i]] + w[i]); cout << f[m]; return 0;}
多重背包
- 每件物品可取有限次
- 朴素代码:
const int N = 110;int f[N][N], v[N], w[N], s[N];int n, m;int main(){ cin >> n >> m; for(int i = 1; i <= n; ++ i) cin >> v[i] >> w[i] >> s[i]; for(int i = 1; i <= n; ++ i) for(int j = 1; j <= m; ++ j) for(int k = 0; k <= s[i] && k * v[i] <= j; ++ k) f[i][j] = max(f[i][j], f[i - 1][j - k * v[i]] + k * w[i]); cout << f[n][m]; return 0;}
- 空间优化:
- 滚动数组优化
- 代码:
const int N = 110;int f[N], v[N], w[N], s[N];int n, m;int main(){ cin >> n >> m; for(int i = 1; i <= n; ++ i) cin >> v[i] >> w[i] >> s[i]; for(int i = 1; i <= n; ++ i) for(int j = m; j >= v[i]; -- j) for(int k = 0; k <= s[i] && k * v[i] <= j; ++ k) f[j] = max(f[j], f[j - k * v[i]] + k * w[i]); cout << f[m]; return 0;}
- 二进制优化:
- 将每个物品取的次数分为若干组,各组为1,2,4,8....2^k,c 的二进制数,在组中任意选取若干组,每组看作新的物品只能选一次,所有的次数都能由这几组二进制数表示,由于每组只能选一次,故化为01背包问题
- 代码:
const int N = 2e4 + 500;int v[N], w[N], s[N];int f[N];int n, m;int main(){ cin >> n >> m; int cnt = 0; //记录物品个数 while(n -- ){ int V, W, S; cin >> V >> W >> S; int k = 1; //记录分解后每个物品的次数 while(k <= S){ //将数量S分解 cnt ++ ; //每次分解个数加一 w[cnt] = W * k; v[cnt] = V * k; S -= k; k *= 2; } if(S > 0){ //剩余次数 cnt ++ ; w[cnt] = W * S; v[cnt] = V * S; } } n = cnt; //01背包问题 for(int i = 1; i <= n; ++ i) for(int j = m; j >= v[i]; -- j) f[j] = max(f[j], f[j - v[i]] + w[i]); cout << f[m]; return 0;}
分组背包
- 每个组里面最多选一件物品
- 朴素代码:
const int N = 110;int v[N][N], w[N][N];int f[N][N];int s[N];int n, m;int main(){ cin >> n >> m; for(int i = 1; i <= n; ++ i){ cin >> s[i]; for(int j = 1; j <= s[i]; ++ j) cin >> v[i][j] >> w[i][j]; } for(int i = 1; i <= n; ++ i) for(int j = 1; j <= m; ++ j){ f[i][j] = f[i - 1][j]; //该组不选物品 for(int k = 1; k <= s[i]; ++ k){ //该组选物品 if(j >= v[i][k]) f[i][j] = max(f[i][j], f[i - 1][j - v[i][k]] + w[i][k]); } } cout << f[n][m]; return 0;}//或者for(int i = 1; i <= n; ++ i)for(int k = 1; k <= s[i]; ++ k)for(int j = 1; j <= m; ++ j){f[i][j] = max(f[i][j], f[i - 1][j]);if(j >= v[i][k])f[i][j] = max(f[i][j], f[i - 1][j - v[i][k]] + w[i][k]);}
- 空间优化:
const int N = 110;int v[N][N], w[N][N];int f[N];int s[N];int n, m;int main(){ cin >> n >> m; for(int i = 1; i <= n; ++ i){ cin >> s[i]; for(int j = 1; j <= s[i]; ++ j) cin >> v[i][j] >> w[i][j]; } for(int i = 1; i <= n; ++ i) for(int j = m; j >= 1; -- j) for(int k = 1; k <= s[i]; ++ k) if(j >= v[i][k]) f[j] = max(f[j], f[j - v[i][k]] + w[i][k]); cout << f[m]; return 0;}
- 动态规划思路:
关键词:
[动态规划第一节]背包问题汇总
简化Gerber数据传输过程丨GC PowerPlace简介
08.14 上證指數、創業板指數 實戰技術應用
人民子弟兵冲在防汛救灾最前线 基本情况讲解
拆装空调操作过程(拆装空调)
媒体人:付豪可以说出巴特勒名言 他是最努力打球的人
周末带孩子去哪玩(玉溪周末带孩子去哪玩)
华为手机售后服务部(华为手机售后服务)
上饶新闻上饶之窗(上饶新闻网)
昌平市场监管:积极投身灾后重建 全力保障市场秩序
一加 Ace 2 Pro 手机官宣搭载索尼 IMX890 主摄,OIS 光学防抖
虎丘山后僧舍看玉兰用东坡游道场山何山韵(关于虎丘山后僧舍看玉兰用东坡游道场山何山韵简述)
龙山华府“建议”收房业主先交一年物业费 同步交付的车库却没建好
算力股爆发,地产股全线下挫,食用油龙头市值跌破2000亿元!海外机构调研股出炉,医疗龙头最受关注(附股)
湖南中医药大学党委书记戴爱国到东安县调研考察中医药发展
川金诺:公司部分产品市场价格触底企稳有所回暖
内马尔身价变化:加盟巴萨时5000万欧,在巴黎最高达到1.8亿
香港也搞“地摊经济”?财政司司长:正筹划推出夜市以吸引游客
草也能被做成丝?河南这家企业创新产品打破垄断 出口40余国
金科集团向金科服务转让抵销物业代替应付款项 涉及36项物业
黄晓明官宣喜讯,全网都炸了:恭喜啊!
奇幻策略游戏《小王国》上架Steam 2024年Q2发售
建设机械: 公司目前没有股权激励措施
Mysteel
极狐新车 N51 内饰专利图亮相,采用无传统仪表 / 大尺寸 HUD 设计
退休时缴纳的社保基数,是如何计算出来的?
港股异动 | 小鹏汽车-W(09868)跌超6%领跌汽车股 业内预期新能源车降价潮开启
不堪公园噪音 男子竟然持斧报复
梅奥心磁完成A+轮融资,创瑞投资领投
《博德之门3》让《星空》压力山大!(玩家动力)
越览山河、纵情逐梦,郑州日产新帕拉丁震撼上市
赛道跑干一箱油!比思域TYPE-R还快,暴力试驾现代伊兰特N
调血脂不想终生服药?这几种食材妙招建议收藏
黄冈疾控启用2个博士工作室,人才培养迎来新突破
东北地区暴雨警示
后防核心什科里奇伤退打乱节奏,沧州雄狮三连胜戛然而止
打造“世界乳业科技之都” 高质量发展现场会走进优然牧业(09858)敕勒川生态智慧牧场
鸿路钢构:公司目前主要焊接方式为埋弧焊和二氧化碳保护焊
玩的怪花!路虎车内男女激情狂战2小时,路人:刺激,我得拍下来
竞业达(003005):8月14日09时49分触及涨停板
这个市场,火了!警惕!或触犯法律
明泰铝业12.8亿元定增落地 持续布局新能源电池材料领域
韩国医学院招生,皮肤科成热门
左转闯红灯直行扣几分 直行绿灯左转闯红灯扣几分
国网浙江电力组织第三方独立主体参与削峰调峰辅助服务
今天,人民日报点赞福建纪检监察机关!
公告速递:永赢开泰中高等级中短债基金暂停代销机构大额申购、转换转入业务
暑假旅游市场回暖 酒店房源“紧俏”价格上涨
BLACKPINK演唱会升降舞台栏杆未固定,Jennie扶栏杆差点摔下去
未支付2094万美元利息 远洋集团一票据因违约停牌
上半年增收不增利,下半年百威亚太换“新思路”?
介休市召开国考省考问题整改第二阶段“大比武”工作安排暨驻村帮扶工作推进会
工信部:罗俊章任中国工业互联网研究院副院长
医药行业周报:政策情绪已充分释放 关注海外映射减肥和CGM
校企联动 共谋发展 | 三达膜牵手中国科学院大学国际青年学者暑期学校
重大项目建设有力有序推进
忙着举办高端财富论坛的恒昌财富难掩P2P底色
白玉观音吊坠大中小号
老旧小区“新生记”,让老百姓有房住也住得好
江苏大丰龙卷风灾害已致2死15伤 灾后恢复重建工作正有序开展
亲人意外去世怎么查询存款 取已故亲人存款遭拒 法院判了 基本情况讲解
金玉堂:8.14黄金大趋势看空难改,不过多头仍还有较大希望!
盖尔加朵回应出演下一任《007》:感觉空间很大
陕汽L5000 4×2经典版卡车——致富路上的好伙伴
江苏盐城突发龙卷风,致2死15伤!目击者:屋顶都跟着飞起来
搜狗输入法快捷键怎么设置 如何设置快捷键 搜狗输入法中怎么设置快捷键
【政务智库报告】乡村振兴的“德州实践”——德州“多点突破”推动乡村全面振兴观察
国机汽车:下属企业与飞凡汽车、悟空出行签战略合作协议
杨家泊镇:网格送法进村居 “典亮”美好生活
宁德海底捞是不是24小时营业
vivo Pad Air平板电脑发布:配备 11.5 英寸 2.8K 大屏,1799元起
吸引青年人才返乡历练成长
2023年一级造价师考试报名入口
公牛 65W 氮化镓充电器 A1652U 上架:UFCS 融合快充 + 1C1A
芯动联科董秘回复: 公司没有相关计划
《光遇》8.14每日任务怎么做2023
2023年全国海钓锦标赛(海南昌江站)收官 突击海钓俱乐部包揽两项冠军
炮团:谨记“一盔一带”交通安全常在
黑龙江省3条河流超警
vivos17相遇紫发售详情
年内开工!襄阳→宜昌1.5小时
18远洋01:刊登重要公告,连续停牌
百济神州:对贿赂和腐败采取零容忍态度
烧肉模拟器将登陆Switch:8月31日见
红蓝3d电影下载迅雷(3d电影下载迅雷)
18秒就能充满电?!再也不用担心出门手机没电了
离谱!男子吃菌产生驾车撞人幻觉后自首 结果虚惊一场
钱包预警!盘点今年还未发售的知名大作
督导“长牙齿” “双减”见实效
《反垄断法》实施十五周年 | 湖北强化竞争政策实施 护航全国统一大市场建设
上海市金山区消保委开展盲盒消费调查:受访门店未采取有效措施禁售未成年人
汽车整车股震荡走低 多股跌超4%
“河北域通视达”总经理蒋培:城市智慧化 服务精细化
湖南省发布团体标准T/HNNJ 0013-2023《水稻暗室育秧设备》等标准的通知
于吉三国杀技能介绍 于吉
贵阳楼市最新情况(上周泛贵阳楼市继续回暖
细节披露!医疗反腐:有院长收受100套房
两个孩子离婚抚养权怎么分配
NBL常规赛积分榜:安徽文一战胜陕西信达 登顶榜首
湖已提前偿还“18龙湖04”17亿元债务 年内到期境内债务仅余1.19亿元