最佳购物方案的题目

[问题描述]

在一条街上有n个商店,每个商店有一种商品可卖,有数字代替商品名,商品都有价格,各个商店可卖同一种商品而价格可以不一样,现在又一个人要从街头走到结尾去购物,他手上有一张要购买的商品的清单,现在必须按照清单上的次序依次购买商品( 或者可以不按照清单顺序购买 ) ,求花费最小的购物方法;
例如 购物清单:(数字代替商品名) 2 2 5 1
商店情况:
商店 S1    S2    S3    S4  S5    S6    S7    S8
商品  2      3      2      5    2      5      4      1
价格  50    80    40    60  42    65    100  30


[不按照清单顺序-贪心算法] 花费最小的方法是:S3 S4  S5  S8 === 40+60+42+30=172(一个商店最多购买同类商品一个)

[按照清单的顺序-动态规划] 花费最小的方法是:S3 S5  S6  S8 === 40+42+65+30=177(一个商店最多购买同类商品一个)

 

[问题解决]

 

不按照清单数序-得出最省钱的最优解:

Step1:利用一个数组Store[8] ,存放商店的下标,1...8,,然后根据这样的排序比较规则对该数组的数组下标进行排序

(1)按照商品编号小的在前,大的在后

(2)同样的商品编号,价格小的在前,价格大的在后

然后对购物清单的各物品的商品编号进行进行排序,小的在前,大的在后

Step2:然后然后同时遍历排序后的 “购物清单数组” 和 “Store数组”,查看是否当前需要购买的商品即使该Store[i]商店出售的商品,是则输出该商店名称,并累加该商品价格。

 

 

按照清单顺序-按清单顺序最省的解答:

在找到一种可能的情况下,抛开找到的第一个匹配的商店,如果在该商店后续的商店中还存在匹配的情况,且花费更小,则得出较省的解答,如果后续商店中不存在匹配的情况,则后续的后续不可能再出现匹配的情况,直接退出匹配,当前得出的花费最省的情况即为解答。


[程序如下]

 

 


 

 

[输出]:

 

S[1]     S[2]     S[3]     S[4]     S[5]     S[6]     S[7]     S[8]     
2        3        2        5        2        5        4        1        
50       80       40       60       42       65       100       30       

Order List   :   2     2     5     1     

Dynamic Plan for purchase as Order List Sequency:
S[3] + S[5] + S[6] + S[8] = 177

Greed Algorithm for purchase [not]as Order List Sequency:
S[3] + S[4] + S[5] + S[8] = 172

 

 

 

 

S[1]     S[2]     S[3]     S[4]     S[5]     S[6]     S[7]     S[8]     S[9]    
2        5        2        1        2        2        5        5        1       
30       10       25       5       20       40       15       30       10      

Order List   :   2     2     5     1    

Dynamic Plan for purchase as Order List Sequency:
S[3] + S[5] + S[7] + S[9] = 70

Greed Algorithm for purchase [not]as Order List Sequency:
S[2] + S[3] + S[4] + S[5] = 60

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值