最少費用購物問題——動態規划


題目描述

商店中每種商品都有標價。例如,一朵花的價格是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