题目描述
商店中每种商品都有标价。例如,一朵花的价格是2元。一个花瓶的价格是5 元。为了吸引顾客,商店提供了一组优惠商品价。优惠商品是把一种或多种商品分成一组,并降价销售。例如,3朵花的价格不是6元而是5元。2 个花瓶加1 朵花的优惠价是10 元。试设计一个算法,计算出某一顾客所购商品应付的最少费用。
对于给定欲购商品的价格和数量,以及优惠商品价,编程计算所购商品应付的最少费用。
输入
前面的数据提供欲购商品数据。第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件商品。
后面的数据提供优惠商品价数据。第1行中有1 个整数S(0≤S≤99),表示共有S 种优惠商品组合。接下来的S 行,每行的第一个数描述优惠商品组合中商品的种类数j。接着是j 个数字对(C,K),其中C 是商品编码,1≤C≤999。K 表示该种商品在此组合中的数量,1≤K≤5。每行最后一个数字P(1≤ P≤9999)表示此商品组合的优惠价。
输出
程序运行结束时,将计算出的所购商品应付的最少费用输出。
#include<iostream> using namespace std; int num[1000];//商品编号对应第几钟商品 int l[5][3];//商品编号、个数、单价 int O[100][12]={0};//优惠方案(商品种类数、商品编号及个数、价格) int C;//商品编号 int K;//购买的商品数量 int P;//商品单价 int B;//要购买的商品种类数 int S;//商品优惠组合数 int i[5],j[5];//i为总共所需商品数,j为动规过程中当前所需商品数 int mins;//动态规划中的最小值 int dp[6][6][6][6][6]={0};//动态规划状态 int main(){ cin>>B; for(int a=0;a<B;a++){//读入商品购买信息 cin>>l[a][0]; cin>>l[a][1]; cin>>l[a][2]; num[l[a][0]]=a;//将编号转化为序号,方便调用 } cin>>S; for(int b=0;b<S;b++){//读入优惠信息 cin>>O[b][0]; int n; for(n=1;n<=2*O[b][0];n++){ if(n%2==1){//若为编号 cin>>C; O[b][n]=num[C]; } else { cin>>O[b][n]; } } cin>>O[b][n];//优惠价格 } for(i[0]=0;i[0]<=l[0][1];i[0]++){ for(i[1]=0;i[1]<=l[1][1];i[1]++){ for(i[2]=0;i[2]<=l[2][1];i[2]++){ for(i[3]=0;i[3]<=l[3][1];i[3]++){ for(i[4]=0;i[4]<=l[4][1];i[4]++){ if(i[0]==0&&i[1]==0&&i[2]==0&&i[3]==0&&i[4]==0) continue; else{ dp[i[0]][i[1]][i[2]][i[3]][i[4]]=1000000; mins=i[0]*l[0][2]+i[1]*l[1][2]+i[2]*l[2][2]+i[3]*l[3][2]+i[4]*l[4][2];//最小值初始化为不使用优惠方案的价格 for(int m=0;m<S;m++){//遍历所有优惠组合 for(int n=0;n<5;n++){ j[n]=i[n]; } int n=1; for(;n<=2*O[m][0];n+=2){ if(i[O[m][n]]-O[m][n+1]<0){//若该商品当前数量小于优惠方案提供的商品数量 j[O[m][n]]=0;//当前所需商品数量为0 } else{ j[O[m][n]]=i[O[m][n]]-O[m][n+1]; } } if(dp[j[0]][j[1]][j[2]][j[3]][j[4]]+O[m][n]<mins){ mins=dp[j[0]][j[1]][j[2]][j[3]][j[4]]+O[m][n]; } } dp[i[0]][i[1]][i[2]][i[3]][i[4]]=mins; } } } } } } cout<<dp[i[0]-1][i[1]-1][i[2]-1][i[3]-1][i[4]-1]; }