海盗分金问题SQL求解(贪心算法)
问题
经济学上有个“海盗分金”模型:是说5个海盗抢得100枚金币,他们按抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,超过半数同意方案才被通过,否则他将被扔入大海喂鲨鱼,依此类推,假设海盗是足够聪明的先利己再伤人,最后方案是怎样的?
网上百度来的的代码
with a as
(select 101 - rownum n from dual connect by rownum <102),
max_one as
(select max(n) max1 from a),
max_two as
(select /*+leading(p2,p1) use_nl(p1) */ p2.n max2,p1.n max1
from a p1,a p2
where p1.n+p2.n=100
and p1.n=(select max1 from max_one)
and rownum=1),
max_three as
(select /*+leading(p3,p2,p1) use_nl(p2) use_nl(p1)*/ p3.n max3,p2.n max2,p1.n max1
from a p1,a p2,a p3,max_two
where p1.n+p2.n+p3.n=100
and sign(p2.n-max2)+sign(p1.n-max1)>=0
and rownum=1),
max_four as
(select /*+leading(p4,p3,p2,p1) use_nl(p3) use_nl(p2) use_nl(p1)*/ p4.n max4,p3.n max3,p2.n max2,p1.n max1
from a p1,a p2,a p3,a p4,max_three
where p1.n+p2.n+p3.n+p4.n=100
and sign(p3.n-max3)+sign(p2.n-max2)+sign(p1.n-max1)>0
and rownum=1),
five as
(select /*+leading(p5,p4,p3,p2,p1) use_nl(p4) use_nl(p3) use_nl(p2) use_nl(p1)*/ p5.n n5, p4.n n4,p3.n n3,p2.n n2,p1.n n1
from a p1,a p2,a p3,a p4,a p5,max_four
where p1.n+p2.n+p3.n+p4.n+p5.n=100
and sign(p4.n-max4)+sign(p3.n-max3)+sign(p2.n-max2)+sign(p1.n-max1)>=0
and rownum=1)
select * from five;
严格筛选数据优化后
with a as
(select 101 - rownum n from dual connect by rownum <102),
max_one as
(select max(n) max1 from a),
max_two as
(select /*+leading(max_one,p2,p1) use_nl(p2) use_nl(p1) */ p2.n max2,p1.n max1
from a p1,a p2,max_one
where p1.n+p2.n=100
and p1.n>=max1
and rownum=1),
max_three as
(select /*+leading(max_two,p3,p2,p1) use_nl(max_two) use_nl(p2) use_nl(p1)*/ p3.n max3,p2.n max2,p1.n max1
from a p1,a p2,a p3,max_two
where p1.n+p2.n+p3.n=100
AND p3.n+p2.n<=100
and CASE WHEN p2.n > max2 THEN 1 ELSE -1 END +
CASE WHEN p1.n > max1 THEN 1 ELSE -1 END >= 0
and rownum=1),
max_four as
(select /*+leading(max_three,p4,p3,p2,p1) use_nl(max_three) use_nl(p3) use_nl(p2) use_nl(p1)*/ p4.n max4,p3.n max3,p2.n max2,p1.n max1
from a p1,a p2,a p3,a p4,max_three
where p1.n+p2.n+p3.n+p4.n=100
AND p4.n+p3.n <= 100
AND p4.n+p3.n+p2.n <= 100
and CASE WHEN p3.n > max3 THEN 1 ELSE -1 END +
CASE WHEN p2.n > max2 THEN 1 ELSE -1 END +
CASE WHEN p1.n > max1 THEN 1 ELSE -1 END >= 0
and rownum=1),
five as
(select /*+leading(max_four,p5,p4,p3,p2,p1) use_nl(p5) use_nl(p4) use_nl(p3) use_nl(p2) use_nl(p1)*/ p5.n n5, p4.n n4,p3.n n3,p2.n n2,p1.n n1
from a p1,a p2,a p3,a p4,a p5,max_four
where p1.n+p2.n+p3.n+p4.n+p5.n=100
AND p5.n+p4.n <= 100
AND p5.n+p4.n+p3.n <= 100
AND p5.n+p4.n+p3.n+p2.n <= 100
AND CASE WHEN p4.n > max4 THEN 1 ELSE -1 END +
CASE WHEN p3.n > max3 THEN 1 ELSE -1 END +
CASE WHEN p2.n > max2 THEN 1 ELSE -1 END +
CASE WHEN p1.n > max1 THEN 1 ELSE -1 END >= 0
and rownum=1)
select * from five;
结果

海盗分金问题SQL求解(贪心算法)的更多相关文章
- NYOJ 994 海盗分金 逆向递推
链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=994 题意: 有n个海盗劫得了窖藏的m块金子,并准备瓜分这些战利品.按照古老流传下来的分金法则 ...
- 用贪心算法近似求解 Loading Balance 问题(作业调度的负载均衡)
一,Loading Balance 问题描述:有 m 台相同的机器及 n 个作业,其中 m={M(1),M(2),……M(m)}.n = {J(1),J(2),……J(n)}.每个作业都有一个处理时间 ...
- 基于贪心算法求解TSP问题(JAVA)
概述 前段时间在搞贪心算法,为了举例,故拿TSP来开刀,写了段求解算法代码以便有需之人,注意代码考虑可读性从最容易理解角度写,没有优化,有需要可以自行优化! 详细 代码下载:http://www.de ...
- 贪心算法求解活动安排<算法分析>
一.实验内容及要求 1.要求按贪心算法原理求解问题: 2.要求手工输入s[10]及f[10],其中注意自己判断s[i]<f[i]: 3.要求显示所有活动及最优活动安排的i事件列表.二.实验步骤 ...
- PAT Advanced 1046 Shortest Distance (20 分) (知识点:贪心算法)
The task is really simple: given N exits on a highway which forms a simple cycle, you are supposed t ...
- 剑指Offer——贪心算法
剑指Offer--贪心算法 一.基本概念 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解.虽然贪心算法不能对 ...
- js算法初窥05(算法模式02-动态规划与贪心算法)
在前面的文章中(js算法初窥02(排序算法02-归并.快速以及堆排)我们学习了如何用分治法来实现归并排序,那么动态规划跟分治法有点类似,但是分治法是把问题分解成互相独立的子问题,最后组合它们的结果,而 ...
- 贪心算法_01背包问题_Java实现
原文地址:http://blog.csdn.net/ljmingcom304/article/details/50310789 本文出自:[梁敬明的博客] 1.贪心算法 什么是贪心算法?是指在对问题进 ...
- 贪心算法(Greedy Algorithm)
参考: 五大常用算法之三:贪心算法 算法系列:贪心算法 贪心算法详解 从零开始学贪心算法 一.基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以 ...
随机推荐
- zz模型剪枝
论文总结 - 模型剪枝 Model Pruning 发表于 2018-10-03 模型剪枝是常用的模型压缩方法之一.这篇是最近看的模型剪枝相关论文的总结. Deep Compression, Han ...
- 查看ubuntu已安装软件
查看安装的所有软件 dpkg -l “dpkg ”是“Debian Packager ”的简写.为 “Debian” 专门开发的套件管理系统,方便软件的安装.更新及移除.所有源自“Debian”的“L ...
- LOJ 数列分块入门系列
目录 1.区间加+单点查 每个块维护tag,散的暴力改. code: #include<bits/stdc++.h> using namespace std; const int maxn ...
- html--前端jquery基础实例
一.左边的菜单栏 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- [Taro] taro 缓存
taro 缓存 Taro.clearStorageSync() 清除全部缓存 Taro.setStorage(key,value)设置缓存 Taro.getStorage(key)获取缓存 Taro. ...
- ajax与重定向
网上有不少说法ajax的请求url浏览器不会重定向的说法是片面的,正常是这样的: 当服务器将302响应发给浏览器时,浏览器并不是直接进行ajax回调处理,而是先执行302重定向——从Response ...
- CSP-S2019游记 执枪的人,一定要做好被杀的觉悟。
啊,大概是人生中最镇定的三天了. 是了. Day0 教练超级巨,给了我们电话说出去要散养,有事别慌,打电话.身份证丢了别慌,打电话.火车误了别慌,打电话... 然后去了就路上颓颓颓.然后过去试机,打了 ...
- VeeValidate——vue2.0表单验证插件
一.vee-validate入门 vee-validate 是一个轻量级的 vue表单验证插件.它有很多开箱即用的验证规则,也支持自定义验证规则.它是基于模板的,因此它与HTML5验证API类似且熟悉 ...
- 【转】使用Hibernate的好处是什么?
一.Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架,和App Server,和EJB没有什么必然的联系.Hibernate可以用在任何JDBC可以使用的场合,例如Java ...
- [LeetCode] 214. Shortest Palindrome 最短回文串
Given a string s, you are allowed to convert it to a palindrome by adding characters in front of it. ...