问题:
某书店对《哈利波特》做促销活动,一共有5卷。假设每一卷的单独销售价格为8元,如果读者一次购买不同的两卷,就可以扣除5%的费用,三卷则更多。
关于折扣表,不再赘述,看书就好。
我第一眼看到题目想到的是贪心算法,书中第一个讲解也是贪心算法,但是书中解释后发现贪心算法并不适合此题。
然后是书中的解法二,动态规划解法。
package algorithnm;
public class BuyBooks {
private double MAX_VALUE = 12138;
public static void main(String[] args) {
// TODO Auto-generated method stub
BuyBooks bb = new BuyBooks();
double[] bookList = {2,2,2,1,1};
double result = bb.dynamic(bookList[0], bookList[1], bookList[2], bookList[3], bookList[4]);
System.out.println("购书最低价格:"+result);
}
//递归函数
public double dynamic(double x1,double x2,double x3,double x4,double x5){
double[] n = {x1,x2,x3,x4,x5};
//首先进行排序,将最小的放在最后面
rerank(n,5);
if(n[4] > 0 ){//最小的也大于0,所有卷都大于0
return min(5*8*(1-0.25)+dynamic(n[0]-1,n[1]-1,n[2]-1,n[3]-1,n[4]-1),
4*8*(1-0.20)+dynamic(n[0]-1,n[1]-1,n[2]-1,n[3]-1,n[4]),
3*8*(1-0.10)+dynamic(n[0]-1,n[1]-1,n[2]-1,n[3],n[4]),
2*8*(1-0.05)+dynamic(n[0]-1,n[1]-1,n[2],n[3],n[4]),
8+dynamic(n[0]-1,n[1],n[2],n[3],n[4])
);
}else if(n[4] == 0 && n[3] > 0){
return min(MAX_VALUE,
4*8*(1-0.20)+dynamic(n[0]-1,n[1]-1,n[2]-1,n[3]-1,n[4]),
3*8*(1-0.10)+dynamic(n[0]-1,n[1]-1,n[2]-1,n[3],n[4]),
2*8*(1-0.05)+dynamic(n[0]-1,n[1]-1,n[2],n[3],n[4]),
8+dynamic(n[0]-1,n[1],n[2],n[3],n[4])
);
}else if(n[4] == 0 && n[3] == 0 && n[2] >0){
return min(MAX_VALUE,
MAX_VALUE,
3*8*(1-0.10)+dynamic(n[0]-1,n[1]-1,n[2]-1,n[3],n[4]),
2*8*(1-0.05)+dynamic(n[0]-1,n[1]-1,n[2],n[3],n[4]),
8+dynamic(n[0]-1,n[1],n[2],n[3],n[4])
);
}else if(n[4] == 0 && n[3] == 0 && n[2] == 0 &&n[1] > 0){
return min(MAX_VALUE,
MAX_VALUE,
MAX_VALUE,
2*8*(1-0.05)+dynamic(n[0]-1,n[1]-1,n[2],n[3],n[4]),
8+dynamic(n[0]-1,n[1],n[2],n[3],n[4])
);
}else if(n[4] == 0 && n[3] == 0 && n[2] == 0 &&n[1] == 0 &&n[0] > 0){
return min(MAX_VALUE,
MAX_VALUE,
MAX_VALUE,
MAX_VALUE,
8+dynamic(n[0]-1,n[1],n[2],n[3],n[4])
);
}else{
return 0;
}
}
private void rerank(double[] n,int length){
double temp;
int i = length-1;
//排序,将最小的放在最后面
for(; i > 0 ; i--){
for(int j = 0;j < i ;j++){
if(n[j] < n[j+1]){
temp = n[j];
n[j] = n[j+1];
n[j+1] = temp;
}
}
}
}
private double min(double x1,double x2,double x3,double x4,double x5){
double[] n = {x1,x2,x3,x4,x5};
rerank(n, 5);
return n[4];
}
}