最少购物费用问题
来源:互联网 发布:天津港火灾知乎 编辑:程序博客网 时间:2024/04/29 15:37
商店中每种商品都有标价。例如,一朵花的价格是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)表示此商品组合的优惠价。
结果输出:程序运行结束时,将计算出的所购商品应付的最少费用输出到文件output.txt中。
输入文件示例
input.txt
2
7 3 2
8 2 5
offer.txt
2
1 7 3 5
2 7 1 8 2 10
输出文件示例
14
这道题是一道动态规划的题,题目限制最多提供五种商品,可以建一个五维数组来表示最小花费
最小花费就是
min( 单买各种商品 , 使用套餐买各种商品); =
min( (商品i单价P*数量k)的和 , (商品需求数量k - 套餐里该商品的数量J.k)的价格 + 套餐的价格 )
#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;struct youhui{ int price; ///J[i].price 代表 优惠组合i 的价格 int k[100]; ///J[i].k[j] 代表 在优惠组合i里编号为j的商品的数量}J[100]; ///J[i] : 第i种优惠的组合int cost[6][6][6][6][6]; ///cost[i][j][k][l][m] 代表 当要求购买第一种商品数量为i,第二种为j.....时最小花费int P[1000]; ///P[i] 代表 编号为i的商品的单价int num[1000]; ///num[i] 代表 给出的商品的编号int K[1000];/// K[i] 代表编号为i的商品所要求的数量int B,S; ///B代表给出B种商品,S代表 有S种优惠组合void nn(string s){ cout<<s<<endl;}void init(){ for(int i = 0; i < 6; ++i) for(int j = 0; j < 6; ++j) for(int k2 = 0; k2 < 6; ++k2) for(int l = 0 ; l < 6; ++l) for(int m = 0; m < 6; ++m) cost[i][j][k2][l][m] = 0; for(int i = 0; i < 100; ++i){ memset(J[i].k,0,sizeof(int)); }}void print2(){ for(int i = 1; i <= B; ++i) printf("%d: %d---%d \n",num[i],K[num[i]],P[num[i]]); nn("-----------------------"); for(int i = 1; i <= S ;++i){ printf("price: %d\n",J[i].price); for(int j = 0; j < 100; ++j){ if(J[i].k[j] != 0) printf("%d : %d\n",j,J[i].k[j]); } printf("\n"); }}int main(){ int tmp_c; ///*************初始化***********///// memset(P,0,sizeof(int)); memset(K,0,sizeof(int)); memset(num,0,sizeof(int)); init(); ///************输入数据***************//// FILE *fp; fp = fopen("1.txt","r"); if(fp == NULL) printf("wuwu\n"); fscanf(fp,"%d",&B); for(int i = 1; i <= B;++i){ int tmp; fscanf(fp,"%d",&num[i]); tmp = num[i]; fscanf(fp,"%d%d",&K[tmp],&P[tmp]); } fscanf(fp,"%d",&S); for(int i = 1; i <= S; ++i){ int count; fscanf(fp,"%d",&count); for(int j = 1; j <= count; ++j){ fscanf(fp,"%d",&tmp_c); fscanf(fp,"%d",&J[i].k[tmp_c]); } fscanf(fp,"%d",&J[i].price); } ///********主要运算部分*****************************/// cost[0][0][0][0][0] = 0; for(int i = 0; i <= K[ num[1] ]; ++i){ for(int j = 0; j <= K[ num[2] ]; ++j){ for(int k1 = 0; k1 <= K[ num[3] ]; ++k1){ for(int l = 0; l <= K[ num[4] ]; ++l){ for(int m = 0; m <= K[ num[5] ]; ++m){ int mmin = i*P[num[1]] + j*P[num[2]] + k1*P[num[3]]+ l*P[num[4]] + m*P[num[5]]; ///单卖的花费 for(int n = 1; n <= S;n++){ ///各种套餐的花费 if(i < J[n].k[num[1]] || j < J[n].k[num[2]] || k1 < J[n].k[num[3]] || l < J[n].k[num[4]] || m < J[n].k[num[5]] ) continue; int t = cost[i-J[n].k[num[1]]][j-J[n].k[num[2]]][k1-J[n].k[num[3]]][l-J[n].k[num[4]]][m-J[n].k[num[5]]] + J[n].price; if(t < mmin) mmin = t; } cost[i][j][k1][l][m] = mmin; } } } } } printf("%d\n",cost[K[num[1]]][K[num[2]]][K[num[3]]][K[num[4]]][K[num[5]]]); fclose(fp); system("pause\n"); return 0;}/**27 3 28 2 521 7 3 52 7 1 8 2 10**//***min( 单买各种商品 , 使用套餐买各种商品);min( 和(商品i单价P*数量k) , (需求商品数量k - 套餐里该商品的数量J.k)的价格 + 套餐的价格 )**/
0 0
- 最少购物费用问题
- 最少购物费用问题
- 最少费用购物
- 最少费用购物问题,裸DP,动态规划
- 最少费用购物 动态规划
- 最小费用购物问题
- poj 3251: 最少费用
- 购物卷购物问题
- 购物问题
- 最少零钱问题 最少硬币问题
- 最少零钱问题 最少硬币问题
- 最少硬币问题
- 最少硬币问题
- 最少硬币问题
- 【dp】最少硬币问题
- 最少硬币问题
- 最少硬币找零问题
- 最少硬币问题
- Codeforces 733A Grasshopper And the String
- oracle job 定时执行存储过程
- JavaScript中的innerHTML属性的使用
- 在C语言中,double、long、unsigned、int、char类型数据所占字节数
- JAVA主线程等待所有子线程执行完成后主线程再执行
- 最少购物费用问题
- Codeforces 733B Parade
- Linux下NFS服务器
- keepalived高可用
- Java enum的用法详解
- js原型设计模式
- 【数据库】关系代数基本运算
- 走向成功需要一个开始并不断坚持下去
- JQ选择器(常用)