多重背包的取模优化
来源:互联网 发布:极品飞车ola车数据 编辑:程序博客网 时间:2024/05/16 14:39
取模优化
当输入样本特别大时,比如给出上百万件物品,这时候仅靠优化算法仍然不能使运行时间降到满意的范围。可考虑如何减少输入样本。poj1014的discussion上有一个非常巧妙的“取模优化”法。
设价值为v(1<=v<=6)的物品共有n件,我们希望找到一个比较小的数s(s<n), 且将n件物品v减少到s或s-1件,问题的可分性不变。考虑不可分和可分两种情况:
- 如果该问题不可分,那么n-2件v仍然不可分,依次类推,用s或 s-1替换n仍然不可分
- 如果该问题可分,即可分成价值相等的两堆。分两种情况考虑:
- 如果两堆里都有v。 两堆各减一个v,即n改为n-2,仍然可分,可以反复减2直至只有一堆有v。
- 如果仅有一堆有v。 如果将n改为n-2仍可分,则必须满足两个条件: I.没有v的那一堆中,至少有一种其它物品可替换v。II.替换后两堆都至少有一个v。如果n>s时始终满足这两个条件,我们就可以用s或s-1替换n.
下面依次考虑v=1,2,3,4,5,6时如何根据“抽屉原理”得到满足条件I和II的s。
v=1时,s=6 替换法: if(n>6) n=6-n%2
1总能被其它价值替换,所以满足条件I不是问题,为满足条件2,s必须大于6。 因为6是其它价值物品中一次可替换最多1的物品。
v=2时,s=5 替换法: if(n>5) n=4+n%2
由1*(2-1)+3*(2-1)+4*(1-1)+5*(2-1)+6*(1-1) = 9 < 2*5知,s=4时满足条件I。但这里要注意,如果另一堆可替换2的是两个5,那么一次就可替换5个2。为满足条件 II,s不能小于5。所以这里s是5而不是4。
v=3时,s=8 替换法: if(n>8) n=8-n%2
由1*(3-1)+2*(3-1)+4*(3-1)+5*(3-1)+6*(1-1) = 24 < 3*9知,s=8时满足条件I,且最多可替换5个3,所以s=8>5也满足条件II。
v=4时,s=8 替换法: if(n>8) n=8-n%2
由1*(4-1)+2*(2-1)+3*(4-1)+5*(4-1)+6*(2-1) = 35 < 4*9知, s=8时满足条件I,且最多可替换5个4,所以s=8>5也满足条件II。
v=5时,s=12 替换法: if(n>12) n=12-n%2
由1*(5-1)+2*(5-1)+3*(5-1)+4*(5-1)+6*(5-1) = 64 < 5*13知,s=12满足条件I,且最多可替换6个5,所以s=12>6也满足条件II。
v=6时,s=7 替换法:if(n>7) n=6+n%2
由1*(6-1)+2*(3-1)+3*(2-1)+4*(3-1)+5*(6-1) = 45 < 6*8知,s=7满足条件I,且最多可替换5个6,所以s=7>5也满足条件II。
可以看出,“模优化”将无论多么大的输入样本减少到50个以内,极大地减少了计算量,从而显著提高运行效率。而“模优化”的关键就是“抽屉原理”。
- 多重背包的取模优化
- 多重背包的优化
- 多重背包的二进制优化
- 多重背包的二进制优化
- 多重背包的二进制优化
- 多重背包的二进制优化
- 混合背包+多重背包的二进制优化
- 背包问题:多重背包的优化
- hdu2844 多重背包+二进制优化(多重背包的完全背包优化解法)
- 多重背包二进制优化的思考
- hdu 2844 多重背包的二进制优化
- hdu 1171 二进制优化的多重背包
- 多重背包的二进制优化模板
- 多重背包的java实现 二进制优化
- 【挫纪】多重背包问题的优化细节
- 单调队列优化的多重背包
- 多重背包的单调队列优化
- poj1014 Dividing(多重背包的二进制优化)
- 归并排序模板
- 初学JAVA简谈字符串String存储的以及字符串值的比较(==运算符以及equals())
- Web应用的组件化开发
- hdoj-5112-A Curious Matt
- BestCoder 1st Anniversary 1003(HDU5312)
- 多重背包的取模优化
- secureCRT下乱码,同时操作多会话,上传/下载文件,主机间传输文件,创建多级目录
- 树中两个结点的最低公共祖先
- 解析xml
- linux 静态库、共享库
- hdu 1556
- Android如何实现程序按下两次返回键退出应用程序?
- C语言面试题
- Leetcode Isomorphic Strings