hdu1864 最大報銷額(01揹包)

2021-09-06 16:38:40 字數 1471 閱讀 6455

problem description

現有一筆經費能夠報銷一定額度的發票。同意報銷的發票型別包含買圖書(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

該題要注意的就是每張單子a種類的總和不能大與600,相同b,c類也一樣,剛開始我就錯了這裡,還有注意假設不是a,b,c類的不能夠報銷;

該題就是要把浮點型變成整數這樣才幹用01揹包,這裡就僅僅要乘以100就能夠了。

**例如以下:

#include #include #define m 3000057

//因為每張發票不超過1000,最多30張,擴大100倍數後開這麼大就可以

int f[m],val[m],flag[47];

int max(int a,int b)

int main()

if(c == 'a')

a1+=x;

else if(c == 'b')

b1+=x;

else if(c == 'c')

c1+=x;

if(x>60000 || a1>60000 || b1>60000 || c1>60000)

if(flag[i] == 1)

continue;

else

}if(flag[i]!=1)

k++;

else

val[k] = 0;

} for(i = 0 ; i < k ; i++)//01揹包

}printf("%.2lf\n",f[q]/100.0);

} return 0;

}

hdu 1864最大報銷額 01揹包

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

hdu 1864 最大報銷額 01揹包

此題 為01揹包,可以把最大金額當做揹包容量,然後把發票的金額當做揹包的容量和價值 則成了簡單的01揹包 我做此題,錯了n次,究其原因我是把p 60000寫成了p 100000 include include include include include using namespace std d...

01揹包 HDU 1864 最大報銷額

轉化為整數擴大100倍處理 為賦值抑制字元,表示本輸入項對應的資料 讀入後,不賦給相應的變數 如 scanf 2d 2d 3d a,b printf d n d n a,b 輸入123456789 則系統將讀取12並賦給a 讀取34但捨掉 讀取567並賦給b 所以a 12 b 567 處理好輸入後,...