BC14鸡兔同笼升级版

题目 ,参考资料:《python核心编程》第七章

薯片4块钱,鸡蛋2块。

买了的商品数量是5,总价是14块,存货是3(即购买每种商品不能大于3个)

问,买了哪些商品?各几样?


当然这是例题,真正的题目在这

::: {.image-package}
\

::: {.image-caption}
:::
:::

分析:这里应该要用到字典。所谓字典,是指它有一个特殊的结构

普通的数据就是,xx =10。字典,把两个原本不相干的数据联系到一起,把它叫做
key-value 结构。

比如下图,可以构造一个字典: xx = {  '薯片' :’薯片价格’,’薯片数量’
,’鸡蛋’:’鸡蛋价格’,’鸡蛋数量’}

这样,薯片和薯片数量等就联系到了一起。

薯片叫做key(键),薯片数量以及薯片价格叫做value(值)。(key是唯一的,value可以有很多)

::: {.image-package}
\

::: {.image-caption}
数量写错了,应该是小于等于三
:::
:::

当输入key的时候,python就会输出字典的value

::: {.image-package}
\

::: {.image-caption}
:::
:::


建立框架(参考BC11
request
模块)。成功获得所需要计算的数字。

::: {.image-package}
\

::: {.image-caption}
:::
:::

同理,获取字符串的正则表达式为,[a-zA-z]+


成功组合为一个字典

::: {.image-package}
\

::: {.image-caption}
:::
:::


接下来要求值,太多商品了,没什么思路,,依据例题先写个框架吧。

::: {.image-package}
\

::: {.image-caption}
:::
:::

2018年1月9日更新:这道题当初因为做不出来,所以放了许久没碰它,当初以为不能用嵌套循环。问了别人才发现,当初犯的错误可能是str没有转换为int。

用for i in
range()嵌套循环,结果成功算出答案,有很多种答案。这里只取第一个符合条件的就可以了吧。

::: {.image-package}
{.uploaded-img
width=”auto” height=”auto”}\

::: {.image-caption}
:::
:::

源码:通过和上图类似的写法,虽然成功获取了要计算的商品和价格,但是并没有算出答案。。。。。明明类型没有错误

::: {.image-package}
{.uploaded-img
width=”auto” height=”auto”}\

::: {.image-caption}
:::
:::

看来还有地方没想到。。。。。。。又解决了一个bug。因为item是数量,所以理所当然的以为是值Values相加等于购买的数量,然而想一想,Values全部相加的结果是商品单价之和,怎么可能是商品数量。

没想到应该是Key,例如Egg,MusicCD等,这些商品名称被我赋值了,所以整型可以相加。

::: {.image-package}
{.uploaded-img
width=”auto” height=”auto”}\

::: {.image-caption}
:::
:::

然后将答案组合,用webbrowser模块的方法,自动用浏览器打开组合好的url链接。

::: {.image-package}
{.uploaded-img
width=”auto” height=”auto”}\

::: {.image-caption}
:::
:::

没有正确发送cookie,看了很多文章,觉得requests模块虽然方便,但是不够灵活。。也许是我不会用吧。

::: {.image-package}
{.uploaded-img
width=”auto” height=”auto”}\

::: {.image-caption}
:::
:::

::: {.image-package}
{.uploaded-img
width=”auto” height=”auto”}\

::: {.image-caption}
:::
:::

虽然正确的发送了cookie,但显示太慢了。而且好像算错了。

::: {.image-package}
{.uploaded-img
width=”auto” height=”auto”}\

::: {.image-caption}
:::
:::

源码。改正了以后,还是很慢,不知道如何提升效率。。。

::: {.image-package}
{.uploaded-img
width=”auto” height=”auto”}\

::: {.image-caption}
:::
:::

(2018年1月12日更新)对于迭代,python有高级写法,列表推导:下图57到62行,只用一行就可以表示。使用列表推导,不仅简短,效率更加高,因为右边这样的代码,必须使用计数器来跟踪待处理元素,每次循环都需要查看哪些元素已经修改了。

::: {.image-package}
{.uploaded-img
width=”auto” height=”auto”}\

::: {.image-caption}
:::
:::

也许效率还可以提升,因为该代码根据题目不同,有时候能够在3秒内计算完成,有时候不能。

::: {.image-package}
{.uploaded-img
width=”auto” height=”auto”}\

::: {.image-caption}
:::
:::

2018.1.19.根据《大话数据结构》中的第二章节,该脚本的时间复杂度”大O阶”,为O[n的8次方],应该算是很糟糕的算法。。尴尬

补算法去了。
:::
:::
:::