1. 程式人生 > >1045: 最大報銷額(2007年浙江大學計算機及軟件工程研究生機試真題 )

1045: 最大報銷額(2007年浙江大學計算機及軟件工程研究生機試真題 )

urn turn nbsp ios money 格式 計算 size bsp

1045: 最大報銷額

時間限制: 1 Sec 內存限制: 32 MB
提交: 17 解決: 9
[提交][狀態][討論版]

題目描述

現有一筆經費可以報銷一定額度的發票。允許報銷的發票類型包括買圖書(A類)、文具(B類)、差旅(C類),要求每張發票的總額不得超過1000元,每張發票上,單項物品的價值不得超過600元。現請你編寫程序,在給出的一堆發票中找出可以報銷的、不超過給定額度的最大報銷額。

輸入

測試輸入包含若幹測試用例。每個測試用例的第1行包含兩個正數 Q 和 N,其中 Q 是給定的報銷額度,N(N<=30)是發票張數。隨後是 N 行輸入,每行的格式為:
m Type_1:price_1 Type_2:price_2 ... Type_m:price_m
其中正整數 m 是這張發票上所開物品的件數,Type_i 和 price_i 是第 i 項物品的種類和價值。物品種類用一個大寫英文字母表示。當N為0時,全部輸入結束,相應的結果不要輸出。

輸出

對每個測試用例輸出1行,即可以報銷的最大數額,精確到小數點後2位。

樣例輸入

200.00 3
2 A:23.50 B:100.00
1 C:650.00
3 A:59.99 A:120.00 X:10.00
1200.00 2
2 B:600.00 A:400.00
1 C:200.50
1200.50 3
2 B:600.00 A:400.00
1 C:200.50
1 A:100.00
100.00 0

樣例輸出

123.50
1000.00
1200.50


 1
#define _CRT_SECURE_NO_DEPRECATE 2 #include<iostream> 3 #include<algorithm> 4 #include<stdio.h> 5 using namespace std; 6 7 double money[32]; 8 double dp[32]; 9 /*這裏有多張發票,針對不同的金額的發票存在一個選擇的問題,因為總量一定,所以要使用 10 動態規劃來尋求最優解。對每一張合格的發票,進行判斷是否應該要報銷,並記錄下來 11 */ 12 13 int main(){
14 double Q; 15 int N; 16 while (cin >> Q >> N && N != 0){ 17 int m; 18 int k = 0; 19 for (int i = 0; i < 32; i++){ 20 money[i] = 0; 21 dp[i] = 0; 22 } 23 for (int i = 1; i <= N; i++){ 24 cin >> m; 25 double total = 0; 26 bool flag = false; 27 for (int j = 1; j <= m; j++){ 28 char type; 29 double price; 30 getchar(); 31 scanf("%c:%lf", &type, &price);//這種輸入法 32 if (price > 600 || type<A || type>C){//單張發票裏面有單項價格 33 //大於600,或者不在報銷類別裏面的項,該發票就不能報銷 34 flag = true; 35 break; 36 } 37 total += price; 38 } 39 if (!flag && total <= 1000 && total <= Q){ 40 money[k] = total; 41 k++; 42 } 43 } 44 for (int i = 1; i <= k; i++){ 45 if (i == 1){ 46 dp[i] = money[0]; 47 } 48 else{ 49 if (dp[i - 1] + money[i - 1] <= Q){ 50 dp[i] = max(dp[i - 1], dp[i - 1] + money[i - 1]); 51 } 52 else{ 53 dp[i] = dp[i - 1]; 54 } 55 } 56 } 57 58 printf("%.2f\n", dp[k]); 59 } 60 return 0; 61 }

1045: 最大報銷額(2007年浙江大學計算機及軟件工程研究生機試真題 )