最少费用购物问题——动态规划


题目描述

商店中每种商品都有标价。例如,一朵花的价格是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];
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM