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