原创声明:

本故事纯属虚构,如有雷同,纯属巧合。

撸二儿眉头紧锁,盯着电脑屏幕一言不发。

我凑上前儿一瞧,哎呀,正是《三国演义》第四十一回,“刘玄德携民渡江,赵子龙单骑救主”!却说这刘备携百姓弃新野,走攀城,又欲奔襄阳暂避,奈何蔡瑁拒不打开城门,只得转向江陵。途中遇刘表墓,复又伏前痛哭~

众将劝他:”今拥民众数万,日行十余里,似此几时得至江陵?倘曹兵到,如何迎敌?不如暂弃百姓,先行为上!”,刘备哭着说:“举大事者必以人为本。今人归我,奈何弃之?”

百姓闻玄德此言莫不伤感!

这时一位老父上前:”将军仁义,吾等皆愿跟随将军。怎奈吾包裹破旧,不能负重,欲择选数件背之,余弃之,将军可帮老朽定夺?”

刘备答曰“备不才,愿一试!”。

说着走到行李处,老父指道:“此处有一玉壶,重二两,值六两银子;一烟斗,重二两,值三两银子;一石器,重六两,值五两银子;一铁斧,重五两,值四两银子;一宝砚,重四两,值六两银子。老朽此包只得承载十两,将军可有良策,使吾负有所值?”

玄德暗忖道“倘若孔明在此,可询之。奈何先生与二弟前往江夏求救于公子琦,不在吾之左右,为之奈何啊?”

撸二儿看到此处,抓耳挠腮!

我见状,打趣道“盖闻撸二儿有经天纬地之才,扭转乾坤之力,匡扶宇宙之功…blablalba,公可有一策,以助玄德公?”

撸二儿听地得意洋洋,答道“汝所言赞美之词,不过书中寻章摘句,笔下虽有千言,胸中实无一策,此小儿之问,汝竟不知,亦不过如此耳!”

我悻悻道“愿闻其详!”

撸二儿愈加兴奋答道“汝可先列下表:

序号

1

2

3

4

5

物品

玉壶

烟斗

石器

铁斧

宝砚

重量(W)

2

2

6

5

4

价值(V)

6

3

5

4

6

然后每个物品试之,皆列出如下可行之策:

策一:物品1

策二:物品2

策三:物品3

策四:物品4

策五:物品5

策六:物品1 + 物品2

策七:物品1 + 物品3

…….

如此这般,列出所有可选之策,择其最优,岂不解之?”

撸二儿说完,愈发得意起来。

我答道“此虽好,算起来未免复杂,每物有两态,可选或不可选,即:

2*2*……*2 = 2^n;

n

亦即共需计算2^n次,此法未免计算过多啊?”

撸二儿低头沉思,半响问道“公可有良策?”

我又说道“公饱读诗书,每日自比于管仲,乐毅……blablabla~”

撸二儿急忙起身腾出椅子,双手作楫道“小生狂妄,在此班门弄斧,为先生所笑!愿先生不与小儿之见,还望教之!”

我看撸二儿态度诚恳,不忍戏之,便执笔说道“汝可取建立以下模型:

最大的价值:MAX = max( V1X1 + V2X2 + …+ VnXn);

V1,V2,V3…Vn为每物价值;X1,X2,…Xn为0或1;

约束条件:W1X1 + W2X2 +…+ WnXn <Capacity;

W1,W2,…Wn为每物重量;Capacity为包裹承重最大值;

定义当前状态价值:V(i,j);

此值表明第i个物品,当前包裹承重为j时最佳组合对应的价值;

对第i个物品的判断,可分为以下两种情况:

情况一:当前包裹承重j小于物品重量Wi,此时的价值与前i-1的物品价值相等,即

V(i,j ) =V(i-1,j);

情况二:当前包裹承重j大于等于物品重量Wi,此时若选择拿,则:

V(拿) = V(i,j) = V(i-1,j – Wi) + Vi;

若选择不拿,则与前i-1个物品价值相等,则:

V(不拿) = V(i,j) = V(i-1,j)

取V(拿)与V(不拿)大者即可。 

据此填出下表T1:

序号

1

2

3

4

5

物品

玉壶

烟斗

石器

铁斧

宝砚

重量(W)

2

2

6

5

4

价值(V)

6

3

5

4

6

T1

i/j

0

1

2

3

4

5

6

7

8

9

10

0

0

0

0

0

0

0

0

0

0

0

0

1

0

0

6

6

6

6

6

6

6

6

6

2

0

0

6

6

9

9

9

9

9

9

9

3

0

0

6

6

9

9

9

9

11

11

14

4

0

0

6

6

9

9

9

10

11

13

14

5

0

0

6

6

9

9

12

12

15

15

15

不难看出,V(0,j) = V(i,0) = 0,(i,j = 0,1,2…10);

V(1,1):j = 1 < W1 = 2,即V(1,1) = V(0,1) = 0,故取0填入上表V(1,1);

V(1,2):j = 2 = W1 = 2,即V(拿)= V(0,0) + V1 = 6,

                                            V(不拿) = V(0,2) = 0,

                                            V(拿) > V(不拿),故取6填入上表V(1,2);

V(1,3):j = 3 > W1 = 2,即V(拿) = V(1,1) + V1 = 6,

                                           V(不拿) =V(0,3) = 0,

                                           V(拿) > V(不拿),故取6填入上表V(1,3);

以此推之,如

V(4,7):j = 7 > W4 = 5,即V(拿) = V(3,2) + V4 = 6 + 4 = 10,

                                          V(不拿) =V(3,7) = 9,

                                          V(拿) > V(不拿),故取10填入上表V(4,7);

汝填完此表,汝即可知选择物品得到的最大价值!”

撸二儿得此表,聚精会神地填写起来~

须庾,表填毕,撸二儿拿起表来,捻须好一番审视!

“先生,小生还有一问。”撸二儿问道,

“汝但问无妨!”我爽快地答道。

“此虽能获得所选之物最大价值,却不能得出所选物品,还请先生赐教。”撸二儿问道。

“好,及俺给你道来!”我按在桌台上又问道:

“汝可知,选择物品最大价值在何处?”我问道,

“余观表T1可知,所取最大值在V(5,10),V(5,9)V(5,8)处。”撸二儿答道。

“善!既如此,不妨取V(5,10)以观之:

V(5,10) ≠ V(4,10),即已取物品5,而又观:

V(5,10) = V(4,6) + V5 = 9 + 6 = 15,知:

V(5,10)上一状态为V(4,6)

循此法,即可知所选之物为5、2、1,具以表T2以示。”我缓缓说来。

T2

i/j

0

1

2

3

4

5

6

7

8

9

10

0

0

0

0

0

0

0

0

0

0

0

0

1

0

0

6

6

6

6

6

6

6

6

6

2

0

0

6

6

9

9

9

9

9

9

9

3

0

0

6

6

9

9

9

9

11

11

14

4

0

0

6

6

9

9

9

10

11

13

14

5

0

0

6

6

9

9

12

12

15

15

15

“得遇先生所论,甚善,待吾乘时间机器到那三国,以助玄德公!”说罢,撸二儿自念咒语“ѾѽѺѨѩҚXLѤҀSHAҁӁ!”念完风起云滚,忽得一道闪电,携撸二儿一同进入到那荧幕中~

刘备正愁眉莫展,忽得一阵怪风袭来!

飘飘然来一位鹤发单颜的老者,对备曰“将军莫虑,如在下给你道来~~”,这位仙风道骨的老者正是撸二儿,他教以刘备如是这般,使得备顷刻茅塞顿开!

说完,撸二儿正欲归来,备扯着撸二儿的袖子道“备遇先生,如久旱遇甘霖…blablabla~”

附代码/C++

 
//背包问题
//给定n种物品和一个容量为Capacity的背包,物品i的重量是wi,其价值为vi
const int VNUM = 6;
const int WNUM = 6;
const int CAPACITY = 10;
int values[VNUM] = {0,6,3,5,4,6};
int weights[WNUM] = {0,2,2,6,5,4};
int maxvalue[VNUM][CAPACITY+1] = {0};
int MaxValue(){int i,j;for (i = 1; i <= VNUM; i++) {for (j = 1; j <= CAPACITY; j++) {//剩余空间不够装if (j < weights[i]) {maxvalue[i][j] = maxvalue[i-1][j];}//剩余空间可装else {//选择装与不装之间中的较大值maxvalue[i-1][j] > (maxvalue[i-1][j-weights[i]] + values[i]) ?maxvalue[i][j] = maxvalue[i-1][j] :maxvalue[i][j] = maxvalue[i-1][j-weights[i]] + values[i];}}}return maxvalue[VNUM-1][CAPACITY];}
//查找哪些物品被选入
 
int items[VNUM] = {0};
void Find(int i,int j) {if (i < 1) return;if (maxvalue[i][j] == maxvalue[i-1][j]) {items[i] = 0;    //与未选状态相等,不选Find(i-1,j);}else if( j >= weights[i] && maxvalue[i][j] == maxvalue[i-1][j-weights[i]] + values[i]) {items[i] = 1;    //与未选状态不等,找出上一状态Find(i-1,j-weights[i]);}}

(以上内容若有不严谨,错误之处,欢迎各位大佬指正,感激不尽!)

超简单背包问题动态规划之三国篇相关推荐

  1. 【动态规划】简单背包问题II

    问题 J: [动态规划]简单背包问题II 时间限制: 1 Sec  内存限制: 64 MB 提交: 127  解决: 76 [提交] [状态] [讨论版] [命题人:admin] 题目描述 张琪曼:& ...

  2. 01背包问题 动态规划 java实现 简单通俗易懂

    ** 01背包问题 动态规划 ** 1.动态规划 什么是动态规划?动态规划就是将一个大问题不断向下拆分成小问题,直到拆分出的小问题可以求出其解,然后将小问题的解不断的向上合并,最终得到大问题的解决方案 ...

  3. 黑群晖docker清理缓存_黑群晖 NAS 瞎折腾 篇一:超简单的docker设置frp内网穿透

    黑群晖 NAS 瞎折腾 篇一:超简单的docker设置frp内网穿透 2020-04-15 11:32:08 25点赞 241收藏 27评论 你是AMD Yes党?还是intel和NVIDIA的忠实簇 ...

  4. 题解:魔法少女(动态规划超简单)

    前些时间虚渊玄的巨献小圆着实火了一把.在黑长直(小炎)往上爬楼去对抗魔女之夜时,她遇到了一个问题想请你帮忙.因为魔女之夜是悬浮在半空的,所以她必须要爬楼,而那座废墟一共有 nn 层,而且每层高度不同, ...

  5. 迷你世界电锯机器人_迷你世界:三分钟制作超简单飞翔石像机器人报道!

    更多游戏资讯,请点击上方蓝字查询! 哈喽,大家好,还记得我之前分享的超简单的石像机器人吗?不记得了吗?我再帮助大家回忆回忆,之前研游酱分享的石像机器人总共是分两篇文章,一个是不会动的入下图,一个是会动 ...

  6. 用python实现视频换脸_超简单使用Python换脸实例

    换脸! 这段时间,deepfakes搞得火热,比方说把<射雕英雄传>里的朱茵换成了杨幂,看下面的图!毫无违和感! 其实早在之前,基于AI换脸的技术就得到了应用,比方说<速度与激情7& ...

  7. swiper怎么在HTML引入JS文件,Swiper.js插件超简单实现轮播图

    Swiper是纯javascript打造的滑动特效插件,面向手机.平板电脑等移动终端.能实现触屏焦点图.触屏Tab切换.触屏多图切换等常用效果.超好用 话不多说,直接上教程 1.首先加载插件,需要用到 ...

  8. 超简单JS实现把鼠标选中文字发送到新浪微博

    最近注意到新浪博客有个小功能,就是当鼠标选中一段文字时会浮现一个小图片,点击这个图片可以把选中内容发送到新浪微博,一时兴起昨晚就写了一个Demo玩了一下,代码超简单,没优化,有兴趣的朋友可以自己改进. ...

  9. 超简单让.NET Core开发者快速拥有CI/CD的能力-Docker版本

    超简单让.NET Core开发者快速拥有CI/CD的能力-Docker版本 前言 上一篇自动化测试,全面且详细的介绍了从零开始到发布版本的步骤,这是传统的方式,本次为大家带来的是如何在5分钟内使用上d ...

最新文章

  1. linux基础(2)-网卡配置
  2. go语言项目优化(经验之谈)
  3. IOS9+基础之警报框弹出和操作表弹出
  4. Java 性能优化系列之3.1[JVM调优]
  5. 解决github拉项目慢的问题
  6. 用广播监听安卓设备电量状态
  7. rest 网络设计开发,降低复杂性设计方案
  8. 阿里云块存储快照服务背后的技术原理
  9. Sap Hana触发器
  10. SSM项目转Springboot项目
  11. 2022年视频号的五大机会,教育商家该如何上车?
  12. 二倍图三倍图什么意思_iOS 2倍图 3倍图适配小结
  13. 【Excel 教程系列第 14 篇】批量替换 Excel 中单元格的背景色
  14. 为什么顶级程序员都有超强逆商?顶级程序员马化腾在艰难的时候,是如何度过的?
  15. iOS根据相册图片识别条形码、二维码以及脸部特征
  16. 拉流与推流的区别_RTSP协议交互流程之推流分析
  17. nginx开启Gzip压缩,Vue性能优化之使用gzip压缩打包
  18. 计算机应用基础实验指导实验八,计算机应用基础第八章上机实验
  19. 宝塔面板隐藏网站服务器真实IP
  20. 吉大c 语言程序设计奥鹏作业,吉大19年9月《C语言程序设计》作业考核试题

热门文章

  1. 安卓自定义View进阶-事件分发机制详解
  2. tomcat java 热部署,tomcat热部署
  3. 一级建造师-通信-必学问题
  4. 青岛市2021 夏季高考成绩查询,2021年青岛高考各高中成绩及本科升学率数据排名及分析...
  5. python vs Java(谁更胜一筹)
  6. MySQL 常用的 procedure
  7. 多函数计算并返回n的阶乘
  8. 元气骑士 自建服务器,七夕元气骑士联机盒子服务器官方版
  9. MySQL基础篇 | union、limit、DDL、DML、约束
  10. c语言输出7 和7 的倍数