观察下面的表格
B1 B2 B3 B4 A1 9 9 8 3 10 A2 2 6 4 4 40 A3 8 9 3 4 30 A4 3 3 5 2 60 A5 9 9 1 6 90 50 60 50 70
上表中 A1~A5 表示 5 家快递公司, B1~B4 表示 4 种商品,矩阵内的值表示快递公司运送某种商品的单价。
矩阵右侧的值表示各家快递公司需要运送的商品总数
矩阵下方的值表示每种商品的总数
求满足上述约束条件的最小运费
![]() | 1 liuzhster 2016-12-15 16:11:59 +08:00 多重背包问题? |
![]() | 2 goodryb 2016-12-15 16:14:06 +08:00 下表不是从 0 开始,差评 |
![]() | 3 Kilerd 2016-12-15 16:14:41 +08:00 感觉楼上说对了,可以试试。 这种就是背包模型嘛。 |
![]() | 4 q397064399 2016-12-15 16:52:51 +08:00 动态规划题,() 先把递归公式写出来吧,写出来就差不多了 |
![]() | 5 q397064399 2016-12-15 16:56:30 +08:00 个人建议 不会背包 或者 背包不熟悉 ,这种题目 直接给它穷举就好了 |
6 ArieShout 2016-12-15 18:46:50 +08:00 via iPhone 前面几位回答就像数学答案上面的“易得”,“显然”一样呃 |
![]() | 7 justyy 2016-12-15 19:18:43 +08:00 个人感觉应该是动态规化,可是我写不出来公式。。有大牛教教 我么? 如果 A 只有 5 个, B 只有 4 个, 完全可以暴力。 |
![]() | 8 qinjiannet OP @q397064399 这个问题穷举的复杂度是多少? |
![]() | 9 wodesuck 2016-12-15 22:21:32 +08:00 为什么这么多人说是背包? 我觉得是个费用流啊。 求背包状态转移方程。 |
10 billgreen1 2016-12-15 23:36:14 +08:00 ![]() 如果商品是整数,那么是整数规划问题,有现成的软件包的 |
![]() | 11 q397064399 2016-12-16 05:32:06 +08:00 @qinjiannet 排列组合就好,自己算吧 |
![]() | 12 q397064399 2016-12-16 05:38:01 +08:00 @ArieShout 不是显然,或者易得, 刷 OJ 的人 大多都会临时突击 各种算法 , 目的是啥,不还是套路,既然出了这个题目,就证明这个问题是计算可行性的,那不就是套路了, 万千世界,其实就一个套路 就可以解释,万物所有的规律 包括 牛顿定律 啥的 都是套路, 这题就算不是 DP 也跟 DP 差的八九不离十, |
![]() | 13 q397064399 2016-12-16 06:00:21 +08:00 @qinjiannet 但是穷举有一个问题,要排除无效集 穷举的思路 是针对限定条件的,例如 B1 B2 B3 B4 A1 9 9 8 3 10 A2 2 6 4 4 40 A3 8 9 3 4 30 A4 3 3 5 2 60 A5 9 9 1 6 90 50 60 50 70 这里 10 40 30 60 90 就是一个限定条件, 显然可以通过枚举计算出 10 40 30 60 90 ,分别 由 4 个整数组成的 排列组合, 这样就枚举出来 所有 A1 快递公司所能 运送 4 种商品的 条件集合 快递公司的运送不同商品的结果集计算复杂度 O(n4) 貌似还有更优的算法,不过我了解过(如果有知道的 可以告知我一声) A1 计算次数是 ( 10 ) 4 次方 A2 计算次数是 ( 40 ) 4 次方 .. A5 的计算次数是( 90 ) 4 次方 依次下来 通过过滤 就能得到所有快递公司 运送这 4 种商品的可行性集合, (但是这个可行性集 并不满足货物数量的限定条件) 然后再从这个集合中,找出 符合( 50 60 50 70 )的集合 最终从这个合法的集合当中 排序获得最大值即可 |
![]() | 14 q397064399 2016-12-16 06:03:37 +08:00 @wodesuck 这个问题 其实只要上过高中就能解,但是通过限定条件穷举出 合法集,是一种非常傻逼的行为, 在会算法的程序员来看(我真不会多少算法),这种方法有点 Low 假如问题规模变大了,几乎是很难解的出来 |
![]() | 15 q397064399 2016-12-16 06:09:06 +08:00 DP 的思想 其实就是通过转移方程,将一些不必要的计算结果集 给排除掉了 |
![]() | 16 q397064399 2016-12-16 06:12:31 +08:00 再次强调,通过 X Y 的限定条件来穷举合法矩阵集的最优解 是非常 Low 的行为, 如果有 人知道此类问题的算法叫什么名字 麻烦请告知我一声,(除了 DP ) |
![]() | 17 Xs0ul 2016-12-16 07:21:57 +08:00 via Android ![]() 看起来像是线性规划( |
18 zouxy 2016-12-16 07:34:27 +08:00 via iPhone 好像叫 单纯形法 |
19 zouxy 2016-12-16 07:36:52 +08:00 via iPhone ![]() 华罗庚主持编写那本绿色封面 运筹学 上有 |
![]() | 20 BBrother 2016-12-16 09:24:22 +08:00 有种运筹学作业的既视感 |
![]() | 21 sengxian 2016-12-16 13:32:23 +08:00 |
![]() | 22 sengxian 2016-12-16 13:33:29 +08:00 ![]() |
![]() | 23 sengxian 2016-12-16 13:38:47 +08:00 这个题网络流的点数是 $O(n + m)$,边数是 $O(nm)$ 的,鉴于网络流的复杂度都比较高,所以大概只能跑几百的数据。 |
![]() | 24 qinjiannet OP @sengxian 图中的(a, b)表示容量为 a ,初始流量为 b 吗? |
![]() | 25 sengxian 2016-12-16 14:05:58 +08:00 via iPhone ![]() 容量为 a ,费用为 b 。 |
![]() | 26 akira 2016-12-16 14:34:36 +08:00 ![]() |
27 peihanw 2016-12-19 10:26:31 +08:00 典型线性规划问题,用 GLPK 写一个 model 定义文件,秒解。 |
![]() | 28 hannah520 2016-12-23 16:17:06 +08:00 ![]() 122 |
![]() | 29 hannah520 2016-12-23 16:19:15 +08:00 ![]() 啊啊啊啊,竟然回答也需要铜币!重新回答一次吧 数学模型: *******************************并不造如何上传公式或者图片************************************** matlab 求解: function [f]=transport(x) f=0; C=[7 1 1 6 3 3 7 6 9 7 9 5 4 2 5 8 7 1 3 9]; for i=1:20 f=f+x(i)*C(i); end end lb = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]; ub = [Inf Inf Inf Inf Inf Inf Inf Inf Inf Inf Inf Inf Inf Inf Inf Inf Inf Inf Inf Inf]; x0 = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]; Aeq = [1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0; 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0; 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0; 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1; 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1]; Beq = [30 90 30 60 70 30 50 40 20]; [x,f] = fmincon(@transport,x0,[],[],Aeq,Beq,lb,ub) 结果如下: x = 1 至 13 列 0.0000 39.1780 30.0000 0.8220 20.8220 0.0000 0.0000 9.1780 0.0000 0.0000 0.0000 50.0000 9.1780 14 至 20 列 30.8220 0.0000 0.0000 0.0000 20.0000 0.0000 0.0000 f = 560.0000 |