免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: marksman201
打印 上一主题 下一主题

shell排序 [复制链接]

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
91 [报告]
发表于 2010-09-30 09:34 |只看该作者
LZ的需求,我的代码改四个字节就能做到,可是何必呢= =贪心复杂度会更好的:
  1. import re

  2. def pack(li, limit):
  3.     limit = int(limit * 100)
  4.     li = map(lambda x: int(x * 100), li)
  5.     dp = [0] * (limit + 1)
  6.     use = [[False] * len(li) for x in xrange(limit + 1)]
  7.     for i in xrange(len(li)):
  8.         for w in xrange(limit, li[i] - 1, -1):
  9.             if dp[w] < dp[w - li[i]] + 1:
  10.                 dp[w] = dp[w - li[i]] + 1
  11.                 use[w] = use[w - li[i]][:]
  12.                 use[w][i] = True
  13.     li = filter(None, map(lambda a, b: a and b, use[limit],
  14.                           map(lambda x: float(x) / 100, li)))
  15.     return sum(li), li

  16. def solve(s):
  17.     for line in filter(None, s.split("\n")):
  18.         table = {}
  19.         li = []
  20.         for item in line.split():
  21.             k, v = re.match("(.*):(.*)", item).group(1, 2)
  22.             table[float(v)] = item
  23.             li.append(v)
  24.         ans = pack(map(float, li), 0.49)
  25.         print ans[0], " ".join(table[v] for v in ans[1])

  26. solve("""
  27. a:0.13 b:0.23 c:0.05 d:0.45 e:0.07
  28. p:0.13 q:0.20 r:0.13 s:0.33 t:0.23
  29. h:0.08 g:0.11 r:0.05 y:0.45 s:0.24
  30. g:0.01 q:0.02 r:0.03 s:0.04 t:0.05
  31. g:0.21 q:0.22 r:0.03 s:0.04 t:0.05
  32. """)
复制代码
python  "noname\2010-09-29-2.py"
0.48 a:0.13 b:0.23 c:0.05 e:0.07
0.46 r:0.13 q:0.20 r:0.13
0.48 h:0.08 g:0.11 r:0.05 s:0.24
0.15 g:0.01 q:0.02 r:0.03 s:0.04 t:0.05
0.33 g:0.21 r:0.03 s:0.04 t:0.05
Hit any key to close this window...

论坛徽章:
0
92 [报告]
发表于 2010-09-30 09:35 |只看该作者
本帖最后由 ashlv 于 2010-09-30 09:40 编辑

回复 90# starwing83


    Orz,惯性思维,一看到就自然而然的套上去了

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
93 [报告]
发表于 2010-09-30 09:49 |只看该作者
回复 80# starwing83


    按照你这个理解的话,用脚本我还真写不出来呢。

比如一堆数,有个0.49的,但是最小的大于0.1了,那么最优的也就是0.49这个了。
脚本写还真的得考虑一下啊

论坛徽章:
0
94 [报告]
发表于 2010-09-30 09:59 |只看该作者
回复 28# blackold


    他要求最大化,所以恐怕要先排序

论坛徽章:
0
95 [报告]
发表于 2010-09-30 10:02 |只看该作者
回复 93# expert1


    0.49可不是最优哇,题目没有要求尽可能大,只要求了小于0.5而已,所以取哪个都一样

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
96 [报告]
发表于 2010-09-30 10:07 |只看该作者
回复 95# ashlv


    呵呵,我的意思是:找出满足小于0.5的最小K项,楼上的几个Python大概也是这个意思。
楼主的意思是:是找出满足小于0.5的最大K项

其实2个类似,shell找出最小的K
那么也是排序,满足0。5的前提下,把最大相加。

论坛徽章:
0
97 [报告]
发表于 2010-09-30 10:07 |只看该作者
感觉排序的思路不错

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
98 [报告]
发表于 2010-09-30 10:08 |只看该作者
回复 95# ashlv


    他说的可是“按照我(starwing83)的理解

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
99 [报告]
发表于 2010-09-30 10:08 |只看该作者
回复 98# starwing83


    正解,哈哈

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
100 [报告]
发表于 2010-09-30 10:09 |只看该作者
回复 96# expert1


    额……………………我不是这个意思,我的代码和K无关,只是让和尽量接近0.5,至于取多少项我是不关心的= =
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP