最大報銷額(01揹包)

2021-08-21 15:27:57 字數 1353 閱讀 9222

紀念一下這個題,讀題很重要,單項物品價值不的超過600元,就是說如果一張報銷單同時含幾個型別相同的,這幾個和不超過

600元,否則不報銷,被卡到這了.剩餘就按01揹包做啦

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

input

測試輸入包含若干測試用例。每個測試用例的第1行包含兩個正數 q 和 n,其中 q 是給定的報銷額度,n(<=30)是發票張數。隨後是 n 行輸入,每行的格式為:

m type_1:price_1 type_2:price_2 ... type_m:price_m

其中正整數 m 是這張發票上所開物品的件數,type_i 和 price_i 是第 i 項物品的種類和價值。物品種類用乙個大寫英文本母表示。當n為0時,全部輸入結束,相應的結果不要輸出。

output

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

sample input

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

sample output

123.50

1000.00

1200.50

**:

#includeusing namespace std;

#include#include#include#include#includeint dp[3000010],value[35],m;

double cost;

int number;

char a;

void zeroonepack(int val)

int main()

if(flag&&va<=600&&vb<=600&&vc<=600&&va+vb+vc<=1000)

value[k++]=(int)((va+vb+vc)*100);

}for(i=1;izeroonepack(value[i]);

printf("%.2lf\n",dp[m]/100.0);

}return 0;

}

最大報銷額 揹包

最大報銷額 原題鏈結 本題難度主要在於資料的選擇 之後就是01揹包的問題 同時由於題目要求保留兩位小數 所以我們需要將資料100來計算,由於會100所以要注意dp陣列的大小。以保證小數字的精確 最後要注意double 的輸出 include include include include inclu...

最大報銷額(01)

g 最大報銷額 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status description 現有一筆經費可以報銷一定額度的發票。允許報銷的發票型別包括買圖書 a類 文具 b類 差旅 c類 要求每張發...

hdu 1864最大報銷額 01揹包

當成0 1揹包來做的 思路,先轉化成整數,擴大100倍,首先刪除不符合條件的,然後01揹包 提交情況 memory limit exceed 1次,一開始擴大了1000倍,不過我感覺還是應該擴大1000倍。收穫 printf 0.2lf n double dp int all 100 100 中如果...