HDU 1864最大報銷額 01揹包
阿新 • • 發佈:2018-12-16
我看到網上好多都是將物品的價值,揹包容量擴大一百倍全部轉化為int再最後輸出時轉化為double輸出,所以我想可不可以直接用總支票數作為揹包容量,顯然是可以的。
每一張支票的重量為1,權值即是報銷額度,可以通過計算,直接篩除不符合條件的支票;
由於有一個最大的總報銷額,所以1. dp[j-1]+val[i]<=Q(最大報銷額),則 dp[j]=max(dp[j],dp[j-1]+val[i]);
2. 否則,dp[j]=dp[j];
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> using namespace std; typedef long long ll; const int inf=0x3f3f3f3f; const double epos=1e-8; const int maxn=39; double dp[maxn]; double vall[39]; bool cmp(const double& x,const double& y){return x>y;} int main(){ double Q,val; int n; char c,d; int m; while(scanf("%lf%d",&Q,&n)!=EOF&&n){ memset(dp,0,sizeof(dp)); int t=0; for(int i=0;i<n;i++){ scanf("%d",&m); int flag=1; double aa=0,bb=0,cc=0; while(m--){ getchar(); scanf("%c%c%lf",&c,&d,&val); if(c=='A') aa+=val; else if(c=='B') bb+=val; else if(c=='C') cc+=val; else flag=0; } //將不符合要求的支票刪掉; if(flag==1&&aa<=600&&bb<=600&&cc<=600&&(aa+bb+cc)<=1000&&(aa+bb+cc)<=Q) vall[t++]=aa+bb+cc; } for(int i=0;i<t;i++) for(int j=t;j>=1;j--) if(dp[j-1]+vall[i]<=Q) dp[j]=max(dp[j],dp[j-1]+vall[i]); else dp[j]=dp[j]; //printf("%.2lf\n",dp[t]); sort(dp+1,dp+1+t,cmp); printf("%.2lf\n",dp[1]); } return 0; }