课设的时候做的,在查找之余顺手记在了有道云里,今天特地放在博客里,里面大部分不是自己写的,很多借鉴的,以后想到好的方法还会善加修改,不过现在还在道路上摸索,有不足或者错误的地方望路过的道友指点一二,感激不尽。
商店中每种商品都有标价。例如,一朵花的价格是 2 元。一个花瓶的价格是 5 元。为了吸引顾客,商店提供了一组优惠商品价。
优惠商品是把一种或多种商品分成一组,并降价销 售。例如,3 朵花的价格不是 6 元而是 5 元。2 个花瓶加 1 朵花的优惠价是 10 元。
试设计一个算法,计算出某一顾客所购商品应付的最少费用。
对于给定欲购商品的价格和数量,以及优惠商品价,编程计算所购商品应付的最少费用。
数据输入:
由文件 input.txt 提供欲购商品数据。
文件的第 1 行中有 1 个整数 B(0≤B≤5),表示所购商品种类数。
接下来的 B 行,每行有 3 个数 C,K 和 P。C 表示商品的编码(每种商品有 唯一编码),1≤C≤999。
K 表示购买该种商品总数,1≤K≤5。P 是该种商品的正常单价(每件商品的价格),1≤P≤999。
请注意,一次最多可购买 5*5=25 件商品。
由文件 offer.txt 提供优惠商品价数据。
文件的第 1 行中有 1 个整数 S(0≤S≤99),表示 共有 S 种优惠商品组合。
接下来的 S 行,每行的第一个数描述优惠商品组合中商品的种类数 j。
接着是 j 个数字对(C,K),其中 C 是商品编码,1≤C≤999。
K 表示该种商品在此组合中的数量,1≤K≤5。
每行最后一个数字 P(1≤ P≤9999)表示此商品组合的优惠价。
输入文件示例
input.txt
2
7 3 2
8 2 5
offer.txt
2
1 7 3 5
2 7 1 8 2 10
输出文件示例
output.txt
14
这道题是一道动态规划的题,题目限制最多提供五种商品,可以建一个五维数组来表示最小花费
最小花费就是
min( 单买各种商品 , 使用套餐买各种商品); =
min( (商品i单价P*数量k)的和 , (商品需求数量k - 套餐里该商品的数量J.k)的价格 + 套餐的价格 )
首先这是算法题.
然后答案是:
1 优惠力度最大的是2个花瓶加一朵花 原价12 现在10
2 优惠力度次的是3朵花 优惠1元
所以先计算能满足的2瓶1花数量
再计算3花数量
剩下的按原价
将前面三个加起来就行
实现:
int p1 = 0;
int p2 = 0;
int n1 = n2 = 0;
int price = 0;
p1 = (n1 % 2)
if n2 >= p1&&p1!=0 n2=n2-p1;n1=n1-p1;
p2=n2%3
if p2>0 n2=n2-p2
总价格为:p1*10+p2*5 + n1*2+n2*5
package 最少费用购物;
/**
* @Author: Jason
* @Date: 2019/6/20 9:12
* @Version 1.0
*/
import java.util.Scanner;
class Commodity {
int piece;//购买数量
int price;//购买价格
}
public class MinCostShop {
private static int MAXCODE = 999;//商品编码的最大值
private static int SALECOMB = 99;//优惠商品组合数
private static int KIND = 5; //商品种类
private static int QUANTITY = 5; //购买某种商品数量的最大值
private static int b;//购买商品种类数
private static int s;//当前优惠组合数
private static int[] num = new int[MAXCODE + 1];//记录商品编码与商品种类的对应关系
private static int[] product = new int[KIND + 1];//记录不同种类商品的购买数量
private static int[][] offer = new int[SALECOMB + 1][KIND + 1];//offer[i][j]: 商品组合的优惠价(j=0);某种优惠组合中某种商品需要购买的数量(j>0)
private static Commodity[] purch = new Commodity[KIND + 1];//记录不同商品的购买数量和购买价格
private static int[][][][][] cost = new int[QUANTITY + 1][QUANTITY + 1][QUANTITY + 1][QUANTITY + 1][QUANTITY + 1];//记录本次购买的总花费
public static void main(String[] args) {
init();
comp(1);
out();
}
private static void minicost() {
int i, j, k, m, n, p, minm;
minm = 0;
for (i = 1; i <= b; i++) minm += product[i] * purch[i].price;
for (p = 1; p <= s; p++) {
i = product[1] - offer[p][1];
j = product[2] - offer[p][2];
k = product[3] - offer[p][3];
m = product[4] - offer[p][4];
n = product[5] - offer[p][5];
if (i >= 0 && j >= 0 && k >= 0 && m >= 0 && n >= 0 && cost[i][j][k][m][n] + offer[p][0] < minm)
minm = cost[i][j][k][m][n] + offer[p][0];
}
cost[product[1]][product[2]][product[3]][product[4]][product[5]] = minm;
}
private static void init() {
Scanner input = new Scanner(System.in);
int i, j, n, p, t, code;
for (i = 0; i < 100; i++) for (j = 0; j < 6; j++) offer[i][j] = 0;
for (i = 0; i < 6; i++) {
purch[i] = new Commodity();
purch[i].piece = 0;
purch[i].price = 0;
product[i] = 0;
}
b = input.nextInt();
for (i = 1; i <= b; i++) {
code = input.nextInt();
purch[i].piece = input.nextInt();
purch[i].price = input.nextInt();
num[code] = i;
}
s = input.nextInt();
for (i = 1; i <= s; i++) {
t = input.nextInt();
for (j = 1; j <= t; j++) {
n = input.nextInt();
p = input.nextInt();
offer[i][num[n]] = p;
}
offer[i][0] = input.nextInt();
}
}
private static void comp(int i) {
if (i > b) {
minicost();
return;
}
for (int j = 0; j <= purch[i].piece; j++) {
product[i] = j;
comp(i + 1);
}
}
private static void out() {
System.out.println(cost[product[1]][product[2]][product[3]][product[4]][product[5]]);
}
}
测试用例:
2
7 3 2
8 2 5
2
1 7 3 5
2 7 1 8 2 10
14
下面这个为自己稍微修改,简洁输入的代码,不足之处多多指教。
import java.util.Scanner;
class Commodity {
int piece;//购买种类数量
int price;//购买价格
}
public class MinCostShop {
private static int Maxcode = 999; //商品编码的最大值
private static int Salecode = 99; //优惠商品组合数
private static int Kind = 5; //商品种类M
private static int Quantity = 50; //购买某种商品数量的最大值
private static int b; //购买商品种类数
private static int s; //当前优惠组合数
private static int[] num = new int[Maxcode + 1]; //记录商品编码与商品种类的对应关系
private static int[] product = new int[Kind + 1]; //记录不同种类商品的购买数量
private static int[][] offer = new int[Salecode + 1][Kind + 1];
//offer[i][j]: 商品组合的优惠价(j=0);某种优惠组合中某种商品需要购买的数量(j>0)
private static Commodity[] purch = new Commodity[Kind + 1];
//记录不同商品的购买数量和购买价格
private static int[][][][][] cost = new int[Quantity + 1][Quantity + 1][Quantity + 1][Quantity + 1][Quantity + 1];
//记录本次购买的总花费
public static void main(String[] args) {
init();
comp(1);
out();
}
private static void minicost() {
int i, j, k, m, n, p, minm;
minm = 0;
for (i = 1; i <= b; i++) minm += product[i] * purch[i].price;
for (p = 1; p <= s; p++) {
i = product[1] - offer[p][1];
j = product[2] - offer[p][2];
k = product[3] - offer[p][3];
m = product[4] - offer[p][4];
n = product[5] - offer[p][5];
if (i >= 0 && j >= 0 && k >= 0 && m >= 0 && n >= 0 && cost[i][j][k][m][n] + offer[p][0] < minm)
minm = cost[i][j][k][m][n] + offer[p][0];
}
cost[product[1]][product[2]][product[3]][product[4]][product[5]] = minm;
}
private static void init() {
Scanner input = new Scanner(System.in);
int i, j, n, p, t, code;
for (i = 0; i < 100; i++) for (j = 0; j < 6; j++) offer[i][j] = 0;
for (i = 0; i < 6; i++) {
purch[i] = new Commodity();
purch[i].piece = 0;
purch[i].price = 0;
product[i] = 0;
}
// System.out.println("请输入商品的个数:");
// b = input.nextInt();
// for (i = 1; i <= b; i++) {
// System.out.println("请输入第" + i + "个商品的编码:");
// code = input.nextInt();
// System.out.println("请输入第" + i + "个商品的数量:");
// purch[i].piece = input.nextInt();
// System.out.println("请输入第" + i + "个商品的单价:");
// purch[i].price = input.nextInt();
// num[code] = i;
// }
b = 2;
code = 7;
System.out.println("请输入花的数量:");
purch[1].piece = input.nextInt();
purch[1].price = 2;
num[code] = 1;
code = 8;
System.out.println("请输入花瓶的数量:");
purch[2].piece = input.nextInt();
purch[2].price = 5;
num[code] = 2;
// System.out.println("优惠组合数:");
// s = input.nextInt();
// for (i = 1; i <= s; i++) {
// System.out.println("商品组合数:");
// t = input.nextInt();
// for (j = 1; j <= t; j++) {
// System.out.println("");
// System.out.println("商品的编码:");
// n = input.nextInt();
// System.out.println("商品编码对应的数量:");
// p = input.nextInt();
// offer[i][num[n]] = p;
// }
// System.out.println("优惠组合优惠价格:");
// offer[i][0] = input.nextInt();
// }
s = 2;
t = 1;
n = 7;
p = 3;
offer[1][num[7]] = p;
offer[1][0] = 5;
t = 2;
n = 7;
p = 1;
offer[2][num[7]] = p;
n = 8;
p = 2;
offer[2][num[8]] = p;
offer[2][0] = 10;
}
private static void comp ( int i){
if (i > b) {
minicost();
return;
}
for (int j = 0; j <= purch[i].piece; j++) {
product[i] = j;
comp(i + 1);
}
}
private static void out () {
System.out.println("所购买商品的最少费用为:");
System.out.println(cost[product[1]][product[2]][product[3]][product[4]][product[5]]);
}
}
测试用例:
请输入花的数量:
7
请输入花瓶的数量:
9
所购买商品的最少费用为:
50