最大報銷額
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 24641 Accepted Submission(s): 7534
m Type_1:price_1 Type_2:price_2 ... Type_m:price_m
其中正整數 m 是這張發票上所開物品的件數,Type_i 和 price_i 是第 i 項物品的種類和價值。物品種類用一個大寫英文字母表示。當N爲0時,全部輸入結束,相應的結果不要輸出。
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
int dp[3000050];//由於每張發票不超過1000,最多30張,擴大100倍數後開這麼大即可
int main()
{
char ch;
double x,y;
int sum,a,b,c,money[35],v;
int t,i,j,k;
while(~scanf("%lf%d",&x,&t)&&t)
{
sum = (int)(x*100);//將小數化作整數處理
memset(money,0,sizeof(money));
memset(dp,0,sizeof(dp));
int l = 0;
for(i = 0; i<t; i++){
scanf("%d",&k);
a = b = c = 0;
int flag = 1;
while(k--){
scanf(" %c:%lf",&ch,&y);
v = (int)(y*100);
if(ch == 'A' && a+v<=60000)
a+=v;
else if(ch == 'B' && b+v<=60000)
b+=v;
else if(ch == 'C' && c+v<=60000)
c+=v;
else
flag = 0;
}
if(a+b+c<=100000 && a<=60000 && b<=60000 && c<=60000 && flag)//按題意所說,必須滿足這些條件
money[l++] = a+b+c;//全部符合條件再++
}
for(i = 0; i<=l; i++){
for(j = sum; j>=money[i]; j--)
dp[j] = max(dp[j],dp[j-money[i]]+money[i]);
}
printf("%.2lf\n",dp[sum]/100.0);
}
return 0;
}
01 揹包 但是先把浮點數給去了 *100即可 這個和hdu2955那道又不一樣 那題無法通過擴大倍數來消去小數部分但是這題可以