鱼C论坛

 找回密码
 立即注册
查看: 3139|回复: 16

[已解决]贪心算法(背包问题),有点瑕疵,求解!

[复制链接]
发表于 2016-10-24 21:17:28 | 显示全部楼层 |阅读模式

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

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

x
重量设置在150,应该判断4次,第五次重量就到190了,结果程序输出第五次结果......郁闷


  1. '''
  2.                         贪心算法

  3. 需求:
  4.     有一个背包,背包容量是M=150。有7个物品,物品可以分割成任意大小。
  5.     要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
  6. '''

  7. goods = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
  8. weight = [35, 30, 60, 50, 40, 10, 25]
  9. price = [10, 40, 30, 50, 35, 40, 30]

  10. count = 1
  11. sumWeight = 0
  12. BagSet = []

  13. print('每次挑选物品中价值最大的物品装入背包。')

  14. while True:

  15.     if sumWeight <= 150:

  16.         ChoPri = max(price)
  17.         flag_ChoPri = price.index(ChoPri)
  18.         sumWeight += weight[flag_ChoPri]
  19.         ChoGoods = goods[flag_ChoPri]
  20.         BagSet.append(ChoGoods)
  21.         price[flag_ChoPri] = 0
  22.         print('第%s次挑选过后' % count)
  23.         count += 1
  24.         print('此时背包的重量为%s。' % sumWeight)
  25.         print('此时背包里面的物品有:')
  26.         print(BagSet)
  27.         print('---------------------------')

  28.     else:

  29.         print('贪心也要有个度!')
  30.         break
复制代码
最佳答案
2016-10-24 21:22:00
°﹍M、Sulayman 发表于 2016-10-24 21:19
必    输出第五次!?~

说着玩的,见谅。

感觉建表时用字典好些?

somethings = {'A': [weight. price]}

使用列表然后index这种方法对有重复的数据时会出现很大的不准确性。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-10-24 21:18:02 | 显示全部楼层
无解。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-10-24 21:18:48 | 显示全部楼层
这是基于不分割,每次挑选此刻物品中价值最大的!为什么会输出第五次结果啊,应该输出4次才是对的!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-24 21:19:30 | 显示全部楼层

必    输出第五次!?~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-24 21:22:00 | 显示全部楼层    本楼为最佳答案   
°﹍M、Sulayman 发表于 2016-10-24 21:19
必    输出第五次!?~

说着玩的,见谅。

感觉建表时用字典好些?

somethings = {'A': [weight. price]}

使用列表然后index这种方法对有重复的数据时会出现很大的不准确性。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-24 21:24:31 | 显示全部楼层
°﹍M、Sulayman 发表于 2016-10-24 21:19
必    输出第五次!?~


逻辑有些问题吧:

拿了东西 -> 判断重量 -> 是否放入背包。

现在的逻辑是: 判断重量 -> 拿东西放入背包 -> 判断重量 -> 拿东西放入背包。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-24 21:25:18 | 显示全部楼层
wei_Y 发表于 2016-10-24 21:22
说着玩的,见谅。

感觉建表时用字典好些?

哇!对对对,受教了,原来是index捣的鬼啊,谢谢!!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-24 21:26:17 | 显示全部楼层
°﹍M、Sulayman 发表于 2016-10-24 21:25
哇!对对对,受教了,原来是index捣的鬼啊,谢谢!!!!

不不不,index只是有时会出现失误。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-24 21:28:15 | 显示全部楼层
wei_Y 发表于 2016-10-24 21:24
逻辑有些问题吧:

拿了东西 -> 判断重量 -> 是否放入背包。

我找对论坛了,万分感谢!我有时候写程序有点想当然!对对对,主要还是这个问题,我再看看!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-24 21:29:05 | 显示全部楼层
wei_Y 发表于 2016-10-24 21:26
不不不,index只是有时会出现失误。

一个东西,我学了很多!再次感谢!刚学不久,把字典方法也忘记了,看来要用用~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-24 21:31:08 | 显示全部楼层
°﹍M、Sulayman 发表于 2016-10-24 21:29
一个东西,我学了很多!再次感谢!刚学不久,把字典方法也忘记了,看来要用用~

共同进步。

之前也研究过贪心算法,可以看看哦~。
http://bbs.fishc.com/thread-56473-1-1.html
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-24 21:37:27 | 显示全部楼层
wei_Y 发表于 2016-10-24 21:31
共同进步。

之前也研究过贪心算法,可以看看哦~。

咳咳~我想说......老师留给我们的作业就是五大算法选其一你给我了链接......你你你要负责,万一我自己编不了。复制粘贴你的......我心里过意不去
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-24 21:39:35 | 显示全部楼层
°﹍M、Sulayman 发表于 2016-10-24 21:37
咳咳~我想说......老师留给我们的作业就是五大算法选其一你给我了链接......你你你要负责,万一 ...

等你复制粘贴了你会发现我的代码都是错的。啊哈哈哈。
话说哪五大呢。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-24 21:51:11 | 显示全部楼层
wei_Y 发表于 2016-10-24 21:39
等你复制粘贴了你会发现我的代码都是错的。啊哈哈哈。
话说哪五大呢。

分治,动态规划,贪心,回溯,分支限界
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-24 22:41:30 | 显示全部楼层
贪心算法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-24 22:44:15 | 显示全部楼层
我写了个穷举法,对于你这种组合数量少的,还是很快的。
Max price 170,  Optimization:  (35, 30, 50, 10, 25)
[Finished in 0.2s]
  1. bag = {35:10,30:40,60:30,50:50,40:35,10:40,25:30}
  2. weight = [35,30,60,50,40,10,25]

  3. import itertools as it
  4. possible = []
  5. for i in range(3,6):
  6.         com = it.combinations(weight,i)
  7.         for eachcom in com:
  8.                 bagweight = 0
  9.                 for eachitem in eachcom:
  10.                         bagweight += eachitem
  11.                 if bagweight <= 150:
  12.                         possible.append(eachcom)
  13. prices = []
  14. for each in possible:
  15.         bagprice = 0
  16.         for e in each:
  17.                 bagprice += bag[e]
  18.         prices.append(bagprice)
  19. maxprice = max(prices)
  20. maxcom = possible[prices.index(maxprice)]
  21. print ("Max price %d, " % maxprice, "Optimization: ", maxcom)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-24 23:19:23 | 显示全部楼层
jerryxjr1220 发表于 2016-10-24 22:44
我写了个穷举法,对于你这种组合数量少的,还是很快的。
Max price 170,  Optimization:  (35, 30, 50, 10 ...

谢谢!问题解决了已经,我发了个新帖。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-23 13:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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