鱼C论坛

 找回密码
 立即注册
查看: 3487|回复: 13

一道好难的算法题求大家帮忙

[复制链接]
发表于 2015-1-2 00:31:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
计算随购买数量而变的折扣书的金额

题目描述:
        从前有一套5册的系列书,是关于一个名叫“Harry”的英国英雄的(起码在该问题出现时还只有5本,但之后又出了无数本)。全世界的儿童都认为他非常了不起,自然,出版商也这么认为。作为一种对全人类的无比慷慨的姿态,(以及为了提高销量),出版商制定了下述标价模型,来充分利用Harry的魔力:
5册书的任何1本的价格为8欧元。
如果你购买2本不同的书,你可以得到5%的折扣。
如果你购买3本不同的书,你可以得到10%的折扣。
如果你购买4本不同的书,你可以得到20%的折扣。
如果你购买整个系列,你可以得到25%的折扣。
如果你购买4本书,其中3本书是不同的,那么对那3本书,你可以得到10%的折扣,但第4本的价格仍然是原价8欧元。
        Potter狂热席卷全国,各地少年儿童的父母装着满车的Potter书在柜台外排起了长队。。。你的任务是写段代码,计算每个购物车的金额,尽可能给与最大折扣。
        譬如,这个购物车里的图书算多少钱? 第一册书有2本第二册书有2本第三册书有2本第四册书有1本第五册书有1本 (答案是 51.20 欧元)。 求如何用Python实现

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-1-2 07:50:00 From FishC Mobile | 显示全部楼层
怎么没人喽
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-2 08:22:10 | 显示全部楼层
难得不是编程是数学     

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-2 12:12:00 | 显示全部楼层
本帖最后由 微逻辑 于 2015-1-2 15:35 编辑

写了一个,但结果和楼主的不一样,不知错在哪里。等高手。经楼主提醒,这个答案是错的,没这么简单。
  1. def off(book_list):
  2.     '''按列表中各元素的数量计算折扣并加到总价中'''
  3.     global price
  4.     book_num = len(book_list)
  5.     discount = discount_rate[book_num]
  6.     s = book_list.pop()
  7.     price += s * discount * 8 * book_num
  8.     if len(book_list) == 0:
  9.         return
  10.     for i in range(len(book_list)):
  11.         book_list[i] -= s
  12.         if book_list[i] < 0:
  13.             book_list[i] = 0
  14.     off(book_list)


  15. book_list = []
  16. discount_rate = {5:(1-0.25),4:(1-0.2),3:(1-0.1),2:(1-0.05),1:1} #折扣率
  17. for i in range(5):
  18.     number = input('第%s本书的数量:' % (i+1))
  19.     book_list.append(int(number))
  20. book_list.sort(reverse = True)
  21. price = 0
  22. off (book_list)
  23. print('总价{:1.2f}欧元' .format(price))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-2 13:16:05 | 显示全部楼层
嗯嗯~{:1_1:}楼上对吧。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-2 13:16:22 From FishC Mobile | 显示全部楼层
最后需要求的那种情况是分为两个4本不同最便宜,而不是5本不同和3本不同
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-2 13:18:43 From FishC Mobile | 显示全部楼层
微逻辑 发表于 2015-1-2 12:12
写了一个,但结果和楼主的不一样,不知错在哪里。等高手。

题目最后需要求的那种购书情况,是要分成两个买了4本不同书,而不是5本不同和3本不同
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-2 15:33:49 | 显示全部楼层
落星桀 发表于 2015-1-2 13:18
题目最后需要求的那种购书情况,是要分成两个买了4本不同书,而不是5本不同和3本不同

明白了。我想也不会那么简单。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-2 15:38:39 | 显示全部楼层
写完了,那个,呃……效率有点低。自己优化优化吧。
360截图20150102153658688.jpg



  1. import itertools

  2. def pay(book):
  3.         pay_money = []
  4.         discount = [1,1,0.95,0.9,0.8,0.75]   #折扣
  5.         def inter(books,sums=[]):
  6.                 if len(books) == 0:      #原理和快排差不多,分到最后就出来了。
  7.                         pay_money.append(sum(sums))     #将总数插到需支付的列表里。
  8.                 for i in range(1,6):     #从1开始,这里应该可以优化。
  9.                         temp = itertools.combinations(books,i)    #从购书的列表里组合出不同的组合。长度就是 i.
  10.                         for j in temp:       #加了这步就会慢了。将所有的组合的钱算一下。
  11.                                 temp1 = books[:]
  12.                                 for c in j:      #将已经花了钱的减去。
  13.                                         temp1.remove(c)
  14.                                 inter(temp1,sums=sums+[(8*len(j))*discount[len(set(j))]])
  15.                                 #在sums钱里加上已经支付的钱。如果book列表里没有书了,那就会到pay_money里。
  16.                                 #思路就是快排的思路,一层层的往下分。
  17.                                 #但是递归本身慢,而且还是嵌套的两层循环。
  18.                                 #效率不高效。
  19.         inter(book)
  20.         return min(pay_money)   #可以改的人性化点。

  21. book = []
  22. for i in range(1,6):
  23.         list1 = int(input('需求的数量,从第一册开始。'))
  24.         for j in range(list1):
  25.                 book.append(i)
  26. print(pay(book))
复制代码








小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2015-1-2 16:29:43 | 显示全部楼层
wei_Y 发表于 2015-1-2 15:38
写完了,那个,呃……效率有点低。自己优化优化吧。

学习了,虽然还看不懂。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-2 16:41:21 | 显示全部楼层
wei_Y 发表于 2015-1-2 15:38
写完了,那个,呃……效率有点低。自己优化优化吧。

太感谢了,人间有真爱啊:cry

评分

参与人数 1鱼币 +2 收起 理由
wei_Y + 2 如果可以的话,请勾上'已经解决~'

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-2 20:22:15 | 显示全部楼层
wei_Y 发表于 2015-1-2 15:38
写完了,那个,呃……效率有点低。自己优化优化吧。

佩服
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-5 21:47:36 | 显示全部楼层
本帖最后由 小山童鞋 于 2015-1-5 21:48 编辑

学C的,可以递归和递推,
不知道为什么有点误差。

  1. #include<stdio.h>
  2. #define PRICE 8          //每本书的价格

  3. int books_number[5] = {0};//书的每本书的数量
  4. double discount[5] = {PRICE,
  5.                       PRICE * 0.95,
  6.                       PRICE * 0.9,
  7.                       PRICE * 0.8,
  8.                       PRICE * 0.75};

  9. double calculate()      //核心算法,递归解决
  10. {
  11.     int i = 0,k=0;
  12.     double sum = 0;
  13.     while(i<5)
  14.     {
  15.         if(0 != books_number[i])
  16.         {
  17.             books_number[i]--;
  18.             k++;
  19.         }
  20.         i++;
  21.     }
  22.     if(0 == k)
  23.         return 0;
  24.     else
  25.     {
  26.         sum = discount[k-1] * k;
  27.         return (sum + calculate());           //递归
  28.     }
  29. }
  30. int main()
  31. {
  32.     int i;
  33.     double sum = 0;
  34.     printf("请分别输入五本书的数量\n");
  35.     for(i=0;i<5;i++)
  36.     {
  37.         printf("books_number[%d] = ",i);
  38.         scanf("%d",&books_number[i]);
  39.     }
  40. /*
  41.     for(i=0;i<5;i++)
  42.     {
  43.         printf("books_number[%d] = %d\n",i,books_number[i]);
  44.     }
  45.     for(i=0;i<5;i++)
  46.     {
  47.         printf("discount[%d] = %f\n",i,discount[i]);
  48.     }
  49. */
  50.     printf("\n你需要付的金额为: ");
  51.     sum = calculate();
  52.     printf("%f $\n",sum);
  53.     system("pause");
  54.     return 0;
  55. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-13 09:38:42 | 显示全部楼层
有意思哦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-14 05:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表