知识大全 商店购物
Posted 商品
篇首语:学而不思则罔,思而不学则殆。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 商店购物相关的知识,希望对你有一定的参考价值。
同样是在java坛做了一道作业——商品购物问题 某商店中每种商品都有一个价格 例如 一朵花的价格是 ICU(ICU 是信息学竞赛的货币的单位);一个花瓶的价格是 ICU 为了吸引更多的顾 客 商店提供了特殊优惠价 特殊优惠商品是把一种或几种商品分成一组 并降价销售 例如: 朵花的价格不是 而是 ICU ; 个花瓶加 朵花是 ICU不是 ICU 编一个程序 计算某个顾客所购商品应付的费用 要充分利用优惠价以使顾客付款最小 请注意 你不能变更顾客所购商品的种类及数量 即使增加某些商品会 使付款总数减小也不允许你作出任何变更 假定各种商品价格用优惠价如上所述 并且某顾客购买物品为: 朵花和 个花瓶 那么顾客应付款为 ICU因 为: 朵花加 个花瓶: 优惠价: ICU 朵花 正常价: ICU 输入数据 用两个文件表示输入数据 第一个文件INPUT.TXT描述顾客所购物品(放在购物筐中);第二个文件描述商店提供的优惠商品及价格(文件名为OFF ER.TXT) 两个文件中都只用整数 第一个文件INPUT.TXT的格式为:第一行是一个数字B( ≤B≤ ) 表示所购商品种类数 下面共B行 每行中含 个数C K P C 代表商品 的编码(每种商品有一个唯一的编码) ≤C≤ K代表该种商品购买总数 ≤K≤ P 是该种商品的正常单价(每件商品的价格) ≤P≤ 请注意 购物筐中最多可放 * = 件商品 第二个文件OFFER.TXT的格式为:第一行是一个数字S( ≤S≤ ) 表示共有S 种优惠 下面共S行 每一行描述一种优惠商品的组合中商品的 种类 下面接着是几个数字对(C K) 其中C代表商品编码 ≤C≤ K代表该种商品在此组合中的数量 ≤K≤ 本行最后一个数字P ( ≤ P≤ )代表此商品组合的优惠价 当然 优惠价要低于该组合中商品正常价之总和 输出数据 在输出文件OUTPUT.TXT中写 一个数字(占一行) 该数字表示顾客所购商品(输入文件指明所购商品)应付的最低货款 输入/输出数据举例 (原例不是下面这个 下面这个是我用来测试用的) INPUT TXT: OFFER TXT:
简析 算法 动态规划 数据结构 字符串 题型 II 型 难度 分 编程时间 分钟 简述 本题竞赛时有一个很长的文件测试数据 用动态规划可较快的出答 案
我做这题的时候 没有仔细看上面的简析 而且对 动态规划 概念也不清楚 等这题做完 我才发现虽然我可以简单的得出结果 但是效率上不是最佳的 还需要好好学习一下
import java io FileInputStream; import java io FileNotFoundException; import java io IOException; import java io InputStreamReader; import java io LineNumberReader; import java util HashMap; import java util Stack;
public class Test final static String STR_PRICE = price ; HashMap mapQuantity; HashMap mapPrice; Offer[] offers; Stack stackOffer; int minPrice;
public static void main(String[] strsArg) Test test = new Test();
try test init( INPUT TXT OFFER TXT ); System out println(test getMinPrice()); catch (NumberFormatException e) e printStackTrace(); catch (FileNotFoundException e) e printStackTrace(); catch (IOException e) e printStackTrace();
public Test() mapQuantity = new HashMap(); mapPrice = new HashMap(); stackOffer = new Stack();
public void init(String strInput String strOffer) throws FileNotFoundException IOException NumberFormatException
LineNumberReader input = null; try input = new LineNumberReader(new InputStreamReader( new FileInputStream(strInput))); String str = input readLine(); int lines = Integer parseInt(str); int price = ; for (int i = ; i < lines; i++) str = input readLine(); String[] strs = str split( ); mapQuantity put(Integer parseInt(strs[ ]) Integer parseInt(strs[ ])); mapPrice put(Integer parseInt(strs[ ]) Integer parseInt(strs[ ])); price += Integer parseInt(strs[ ]) * Integer parseInt(strs[ ]); mapQuantity put(STR_PRICE price); minPrice = price; finally if (input != null) try input close(); catch (IOException e) e printStackTrace();
try input = new LineNumberReader(new InputStreamReader( new FileInputStream(strOffer))); String str = input readLine(); int lines = Integer parseInt(str); offers = new Offer[lines]; for (int i = ; i < lines; i++) offers[i] = new Offer(); str = input readLine(); String[] strs = str split( );
int intOfferItems = strs length / ; offers[i] offerItems = new OfferItem[intOfferItems]; int old_price = ; for (int j = ; j < intOfferItems; j++) offers[i] offerItems[j] = new OfferItem(); offers[i] offerItems[j] id = Integer parseInt(strs[j * ]); offers[i] offerItems[unt = Integer parseInt(strs[j * + ]); old_price += offers[i] offerItems[unt * ((Integer) mapPrice get(offers[i] offerItems[j] id)) intValue(); offers[i] old_price = old_price; offers[i] new_price = Integer parseInt(strs[strs length ]);
finally if (input != null) try input close(); catch (IOException e) e printStackTrace();
public int getMinPrice() procMinPrice(mapQuantity); return minPrice;
public void procMinPrice(HashMap mapQuantity) boolean flg = true; for (int i = ; i < offers length; i++) HashMap hashMap = getQuantityFromOffer(mapQuantity i); if (hashMap == null) continue; flg = false; stackOffer push(i); procMinPrice(hashMap);
if (flg) if (minPrice > ((Integer) mapQuantity get(STR_PRICE)) intValue()) minPrice = ((Integer) mapQuantity get(STR_PRICE)) intValue(); if(stackOffer size()> ) stackOffer pop();
private HashMap getQuantityFromOffer(HashMap mapQuantity int iOffer) if (offers[iOffer] new_price >= offers[iOffer] old_price) return null; HashMap hashMap = new HashMap(mapQuantity); int price = ((Integer) hashMap get(STR_PRICE)) intValue();
for (int i = ; i < offers[iOffer] offerItems length; i++) Integer integerCount = (Integer) hashMap get(offers[iOffer] offerItems[i] id); if (integerCount == null) return null; int count = integerCount intValue(); if (count > offers[iOffer] offerItems[unt) hashMap put(offers[iOffer] offerItems[i] id count offers[iOffer] offerItems[unt); else if (count == offers[iOffer] offerItems[unt) hashMap remove(offers[iOffer] offerItems[i] id); else return null; hashMap put(STR_PRICE price offers[iOffer] old_price + offers[iOffer] new_price); return hashMap;
class Offer OfferItem[] offerItems; int new_price; int old_price;
class OfferItem int id; int count;
执行结果是
上面的程序的关键也就是procMinPrice函数 递归搜索所有可能的适用offer 其他的都是周边的读文件和算价钱 没有什么好说的
上面程序有个严重问题 就是会重复计算适用的offer 比方说第一个offer适用 然后检测到第二个offer也适用 这样算出一个总价 但是 先检测第二个offer再检测第一个offer的时候 又重复计算了一遍(其实这次检测也是不应该的)
所以 题目说用动态规划是对的 我没有用 我用的是暴力搜索整个树的根到叶子的路径 效率不高 但是结果总算是出来了
要改进的话 应该加个offer哈希表(注意不是集合 因为offer是可以重复的) 以这个offer哈希表作为递归函数的参数传递(或者是全局变量)
cha138/Article/program/Java/hx/201311/26607相关参考
知识大全 元旦,三个商店搞促销活动,甲商店满400元减180元,乙商店满300元赠送购物券200元,
元旦,三个商店搞促销活动,甲商店满400元减180元,乙商店满300元赠送购物券200元,那要你以什么价格购物了来衡量了,如果以1千元金额为例,甲店实际花费是640元,乙店花费1千元得到了600元的购
商店室内设计有几个消费者行为及心理要点?第一,进入商店的消费者行为及心理商业心理学将顾客分为三类。①有目的的购物者。他们进店之前已有购买目标,因此目光集中,脚步明确,②有选择的购物者他们对商品有一定注
现在人们购物的方式有哪些网购,电视购物,团购,商店,代购,电话购物。网上购物,就是通过网际网路检索商品资讯,并通过电子订购单发出购物请求,然后填上私人支票帐号或信用卡的号码,厂商通过邮购的方式发货,或
越南旅游购物攻略?去越南旅游买什么好?越南购物攻略越南的购物中心里商店林立,出售品质优良的纪念品:包括越南国服、漆器、油画、编织品等,是游客购买纪念品的好去处。当地还有一些艺廊,出售当地画家的作品,从
商店门面装修设计有几个注意要点?一个商店门面一定程度上能反映出其所售商品的档次。大型购物中心的商店门面一般以恢宏见长,小型商店门面则以纤巧取胜。商店入口设计要别具匠心,才能吸引消费者产生进店游览的欲望
商店设计要从几个方面入手?作为装修设计,我们一切的行为,都是吸引客户,让客户购物更方便,心情更愉悦,最终的目的是-为了商品卖的更好。因此一个店面的设计时为了配村商品的销售。做为设计师你首先要明白这商品
北京市海淀区中关村在哪儿逛街?东西便宜?欧美汇购物中心:北京市海淀区中关村丹棱街甲1号欧美汇的南面是新中关购物中心商店价格都差不多如果想要便宜可以去动物园服装批发市场,地铁5站北京市海淀区中关村与西单
店铺照明设计有几种方式?店铺装修中店铺的照明是指商店外观正表面的照明。店面照明的最基本照明功能是让人们在夜间也能看见店面,并便于对店面的识别,以诱发人们的购物、娱乐、休息等活动。店面照明的基本方式:店
在美国历史上黑人曾经遭受到哪些不公平的待遇?1.公交车上黑人白人分开坐。2.有些商店和饭店禁止黑人购物3.有专门的白人学校,禁止黑人上白人的学校。4.在军队里,黑人不能上前线,只能在船底下烧锅炉,煮饭
张先生向商店订购某种商品80件,每件定价100元。张先生向商店经理说:“如果你肯减价,每件减1元,我就多订购四件。”商店
张先生向商店订购某种商品80件,每件定价100元。张先生向商店经理说:“如果你肯减价,每件减1元,我就多订购四件。”商店经理算了一下,如果减价5%,由于张先生多订购,仍可得与原来一样多的利润。则这种商