算法分析设计说明书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法实验周
********************************
—所做任务说明及题目相关知识说明
文档编号:NUC-2013-A07-01
版本: 1.0
作者:张家杰崔风川
打印日期:2013.12.27
拷贝份数:1
©2013中北大学计算机与控制工程学院
1、所做任务:商店购物问题
某商店中每种商品都有一个价格。例如,一朵花的价格是2 ICU(ICU 是信息学竞赛的货币的单位);一个花瓶的价格是5 ICU。为了吸引更多的顾客,商店提供了特殊优惠价。特殊优惠商品是把一种或几种商品分成一组。并降价销售。例如:3朵花的价格不是6而是5 ICU ;2个花瓶加1朵花是10 ICU不是12 ICU。
编一个程序,计算某个顾客所购商品应付的费用。要充分利用优惠价以使顾客付款最小。其中,顾客所购商品信息从input.txt文件中读取,优惠信息从offer.txt文件中读取,
最后将结果输出到output.txt文件中。
2、相关知识说明
蛮力法:
是一种简单直接的解决问题的办法,常常直接基于问题的描述和所涉及的概念的定义。
蛮力法所依赖地基本技术:扫描技术
蛮力法的关键:依次处理所有元素
蛮力法的优点:
(1)理论上可以解决计算领域的所有问题
(2)经常用来解决一些小规模的问题
(3)可以作为某类问题时间性能的底限,来衡量同样问题的更高效算法。
动态规划:是一种使多阶段决策过程最优的通用方法。
如果问题是由交叠的子问题所构成的,我们就可以用动态规划技术解决它。一般来说,这样的子问题出现在对给定问题求解的递推关系中,这个递推关系中包含了相同类型的更小子问题的解。动态规划法建议,与其对交叠的子问题一次又一次的求解,还不如对每个较小的子问题只求解一次并把结果记录在表中,这样就可以在表中得出原始问题的解。
********************************
—数据结构设计说明
文档编号:NUC-2013-A07-02
版本: 1.0
作者:张家杰崔风川
打印日期:2013.12.27
拷贝份数:1
©2013中北大学计算机与控制工程学院
1、为所购商品信息建立一个类GoodsInfo,该类包含id(商品编号)、count(商品数量)、price(商品单价)三个属性。
2、对于每种优惠,建立一个类DiscountInfo,该类包含cateOfGoods(该优惠中商品的种类)、value(该优惠的价值)、goods(该优惠中的商品信息)三个属性,其中goods是HasnMap类型。
3、为了从input.txt文件中读取数据,新建InputFile类,该类包含cateOfGoods (购物筐中商品的种类)、map_Goods(购物筐中商品的信息)两个属性,其中map_Goods是HashMap类型。
4、为了从offer.txt文件中读取优惠的信息,新建OfferFile类,该类包含cateOfDiscount(优惠的种类)、map_Discount(优惠的信息)两个属性,其中map_Discount是HashMap类型。
5、新建一个OutputFile类,其构造方法可向output.txt文件中输出数据。
********************************
—程序模块及流程设计
文档编号:NUC-2013-A07-03
版本: 1.0
作者:张家杰崔风川
打印日期:2013.12.27
拷贝份数:1
©2013中北大学计算机与控制工程学院(1)程序模块
数据结构定义模块:
定义了购物筐中的商品信息和优惠方案中的优惠信息。
文件读取和输出模块:
从文件中读取所购商品信息和有关的优惠信息,程序运行结束后将结果输出到outpu.txt文件中。
算法核心模块:
两种算法——蛮力法和动态规划方法共用上面的数据结构定义模块与文件读取和输出模块,运行程序并将结果输出。
(2)流程设计
蛮力法:
动态规划:
********************************
—源程序清单及说明
文档编号:NUC-2013-A07-04
版本: 1.0
作者:张家杰崔风川
打印日期:2013.12.27
拷贝份数:1
©2013中北大学计算机与控制工程学院
(1)蛮力法
public static void main(String[] args){
static int[] id_Goods;//商品的编号
static int[] count_Goods;//商品的数量
static int[] per_Price;//商品的单价
static int[][] discount;//对应每种优惠方案
static int[] value;//每种优惠方案的价值
.................
int min = func(count_Goods, discount, 0);//调用递归函数
System.out.println("最低价:" + min);
}
public static int func(int num[], int discount[][], int min) { int minPrice[] = new int[discount.length];
for (int i = 0; i < minPrice.length; i++) {
minPrice[i] = min;
}
for (int i = 0; i < discount.length; i++) {//循环测试优惠方案boolean flag = true;
int f[] = new int[num.length];
for (int j = 0; j < num.length; j++) {
f[j] = num[j];
}
for (int j = 0; j < num.length; j++) {
if (num[j] - discount[i][j] < 0) {
flag = false;//若该方案不可用,则设标志位为假
break;
}
}
if (flag) {
for (int j = 0; j < num.length; j++) {
f[j] -= discount[i][j];//方案可用,则商品数量减去该优惠方案中对应的商品
}
minPrice[i] += value[i];//方案可用,则最少花费加上该优惠的价值
int minCost = func(f, discount, minPrice[i]);//递归
minPrice[i] = minCost;//将返回值保存在数组中
} else {