動態規劃 最大報銷額

2021-09-22 02:19:56 字數 1631 閱讀 9239

題目描述

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

輸入測試輸入包含若干測試用例。每個測試用例的第1行包含兩個正數 q 和 n,其中 q(q<=2000) 是給定的報銷額度,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位。

樣例輸入

300.00 3

2 a:33.50 b:150.00

1 c:850.00

3 a:159.99 a:350.00 x:10.00

1100.00 2

2 b:600.00 a:400.00

1 c:300.50

150.00 0

樣例輸出

183.50

1000.00

提示

首先要按照題目的要求計算後判斷每張發票的有效性,接著是乙個動態規劃演算法(沒見過類似題目的同學可以搜一下「揹包問題」),對於此題,由於題目交代了所有金額都只到小數點後兩位,因此乘以100後即是整數,從而可以轉化為01揹包問題,用dp[i]表示到達總金額為i的有效性。

沒臉了。。wa50%,先放著。。

#include

#include

#include

using

namespace std;

int c;

const

int maxn =

3001000

;int a[32]

;int dp[maxn]

;int n;

char str, b;

//分別表示發票型別 和 :

intsearch

(int count)

for(

int i =

1; i < count; i++)}

return dp[c];}

intmain()

else

if(str ==

'b')

else

if(str ==

'c')

else

}//發票資訊輸入完畢

//開始檢查發票是否合法

if(flag && a <=

600&& b <=

600&& c <=

600)

}int res =

search

(count)

;printf

("%.2f\n"

, res /

100.0);

}return0;

}

最大報銷額

本題要看清題目,弄清楚題目的意思,也考了理解題目意思的能力。題目要求是發票要滿足條件才可以報銷,發票上不能含有別類東西,而且每類的 相加不能超過600,所有類相加不能超過一千,所以要用if來判斷發票是否滿足條件用1,0表示。程式的結束也要注意一下。include include include us...

最大報銷額

現有一筆經費可以報銷一定額度的發票。允許報銷的發票型別包括買圖書 a類 文具 b類 差旅 c類 要求每張發票的總額不得超過1000元,每張發票上,單項物品的價值不得超過600元。現請你編寫程式,在給出的一堆發票中找出可以報銷的 不超過給定額度的最大報銷額。input 測試輸入包含若干測試用例。每個測...

最大報銷額

現有一筆經費可以報銷一定額度的發票。允許報銷的發票型別包括買圖書 a類 文具 b類 差旅 c類 要求每張發票的總額不得超過1000元,每張發票上,單項物品的價值不得超過600元。現請你編寫程式,在給出的一堆發票中找出可以報銷的 不超過給定額度的最大報銷額。input 測試輸入包含若干測試用例。每個測...