日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

最小费用购物问题

發(fā)布時(shí)間:2023/12/3 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最小费用购物问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


西安交大 軟件53 蔡少斐

題號(hào):3_14

題目敘述:

某商店中每種商品都有一個(gè)價(jià)格。例如,一朵花的價(jià)格是2 ICU(ICU 是信息學(xué)競(jìng)賽的貨幣的單位);一個(gè)花瓶的價(jià)格是5 ICU。為了吸引更多的顧客,商店提供了特殊優(yōu)惠價(jià)。

??? 特殊優(yōu)惠商品是把一種或幾種商品分成一組。并降價(jià)銷售。例如:3朵花的價(jià)格不是6而是5 ICU ;2個(gè)花瓶加1朵花是10 ICU不是12 ICU。

??? 編一個(gè)程序,計(jì)算某個(gè)顧客所購(gòu)商品應(yīng)付的費(fèi)用。要充分利用優(yōu)惠價(jià)以使顧客付款最小。請(qǐng)注意,你不能變更顧客所購(gòu)商品的種類及數(shù)量,即使增加某些商品會(huì)使付款總數(shù)減小也不允許你作出任何變更。假定各種商品價(jià)格用優(yōu)惠價(jià)如上所述,并且某顧客購(gòu)買物品為:3朵花和2個(gè)花瓶。那么顧客應(yīng)付款為14ICU因?yàn)?

????????1朵花加2個(gè)花瓶: 優(yōu)惠價(jià):10? ICU

????????2朵花???????????正常價(jià): 4?ICU

輸入數(shù)據(jù)

??? 用兩個(gè)文件表示輸入數(shù)據(jù)。第一個(gè)文件INPUT.TXT描述顧客所購(gòu)物品(放在購(gòu)物筐中);第二個(gè)文件描述商店提供的優(yōu)惠商品及價(jià)格(文件名為OFFER.TXT)。 兩個(gè)文件中都只用整數(shù)。

??? 第一個(gè)文件INPUT.TXT的格式為:第一行是一個(gè)數(shù)字B(0≤B≤5),表示所購(gòu)商品種類數(shù)。下面共B行,每行中含3個(gè)數(shù)C,K,P。C 代表商品的編碼(每種商品有一個(gè)唯一的編碼),1≤C≤999。K代表該種商品購(gòu)買總數(shù),1≤K≤5。P 是該種商品的正常單價(jià)(每件商品的價(jià)格),1≤P≤999。請(qǐng)注意,購(gòu)物筐中最多可放5*5=25件商品。

第二個(gè)文件OFFER.TXT的格式為:第一行是一個(gè)數(shù)字S(0≤S≤99),表示共有S種優(yōu)惠。下面共S行,每一行描述一種優(yōu)惠商品的組合中商品的種類。下面接著是幾個(gè)數(shù)字對(duì)(C,K),其中C代表商品編碼,1≤C≤9 99。K代表該種商品在此組合中的數(shù)量,1≤K≤5。本行最后一個(gè)數(shù)字P(1≤P≤9999)代表此商品組合的優(yōu)惠價(jià)。當(dāng)然,優(yōu)惠價(jià)要低于該組合中商品正常價(jià)之總和。

輸出數(shù)據(jù)

在輸出文件OUTPUT.TXT中寫(xiě)一個(gè)數(shù)字(占一行), 該數(shù)字表示顧客所購(gòu)商品(輸入文件指明所購(gòu)商品)應(yīng)付的最低貨款。

題目解答:

本題應(yīng)該采用動(dòng)態(tài)規(guī)劃的方法進(jìn)行設(shè)計(jì),定義本題的最優(yōu)子結(jié)構(gòu)以及狀態(tài)為一個(gè)五元組:dp[x1][x2][x3][x4][x5],其中x1代表要買的第一種物品的個(gè)數(shù),x2代表要買的第二種物品的個(gè)數(shù)、以此類推。由于題目保證了B<=5,因此5元組絕對(duì)夠用。

我們用一個(gè)std::vector來(lái)存儲(chǔ)每套組合方案的捆綁的種類以及該種類需要購(gòu)買的數(shù)量。

下面我們假定,不需要的物品一個(gè)都不能買,需要的物品也不能夠多買。

要列出該5元組的狀態(tài)轉(zhuǎn)移方程,其中優(yōu)惠集合記為S。

.

在代碼實(shí)現(xiàn)的時(shí)候采用了備忘錄技術(shù)。

代碼表示:

#include <iostream> #include <vector> #include <algorithm> using namespace std; typedef pair<int, int> P; const int MAX = 6; const int INF = 1e9; int map[1000]; int n, m; int ids[MAX]; int price[MAX]; int nums[MAX]; vector<P> pairs[100]; int pP[100]; int pcnt = 0; int dp[MAX][MAX][MAX][MAX][MAX]; int times = 0; int dfs( int* x ) {times++;int r = dp[x[0]][x[1]][x[2]][x[3]][x[4]];if ( r > 0 ){return(r);}if ( x[0] == 0 && x[1] == 0 && x[2] == 0 && x[3] == 0 && x[4] == 0 ){return(0);}int minf = INF;for ( int i = 0; i < pcnt; i++ ){vector<P> & vec = pairs[i];int f = 1;int *y = new int[5];for ( int t = 0; t < 5; t++ )y[t] = 0;for ( auto p : vec ){int id = map[p.first];int num = p.second;if ( x[id] < num ){f = 0; break;}y[id] = -num;}if ( !f )continue;for ( int k = 0; k < 5; k++ )y[k] += x[k];minf = min( minf, pP[i] + dfs( y ) );}int s = 0;for ( int i = 0; i < 5; i++ ){s += x[i] * price[i];}minf = min( minf, s );return(dp[x[0]][x[1]][x[2]][x[3]][x[4]] = minf); }int main() {cin >> n;for ( int i = 0; i < n; i++ ){int C, K, PP;cin >> C >> K >> PP;ids[i] = C;nums[i] = K;price[i] = PP;if ( !map[C] ){map[C] = i;}}cin >> m;for ( int i = 0; i < m; i++ ){int k; cin >> k;vector<P> v;int f = 1;for ( int j = 0; j < k; j++ ){int a, b; cin >> a >> b;v.push_back( make_pair( a, b ) );}int PP;cin >> PP;if ( f ){pairs[pcnt] = v;pP[pcnt++] = PP;}}cout << "答案:" << dfs( nums ) << endl;cout << "運(yùn)行次數(shù):" << times << endl;return(0); }

運(yùn)行結(jié)果:


總結(jié)

以上是生活随笔為你收集整理的最小费用购物问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。