1045: 最大報銷額(2007年浙江大學計算機及軟件工程研究生機試真題 )
阿新 • • 發佈:2019-03-17
urn turn nbsp ios money 格式 計算 size bsp
提交: 17 解決: 9
[提交][狀態][討論版]
m Type_1:price_1 Type_2:price_2 ... Type_m:price_m
其中正整數 m 是這張發票上所開物品的件數,Type_i 和 price_i 是第 i 項物品的種類和價值。物品種類用一個大寫英文字母表示。當N為0時,全部輸入結束,相應的結果不要輸出。
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
輸出
對每個測試用例輸出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年浙江大學計算機及軟件工程研究生機試真題 )