HDU 1864 (01揹包)
阿新 • • 發佈:2018-12-10
題目是中文,就不解釋了 。
最近準備系統的刷DP了,從揹包開始。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define ll long long #define clr(a,b) memset(a,b,sizeof(a)) const int maxn = 1010; int i,j,n,num,flag,cnt; double dp[maxn],m[maxn]; char str,b; double q,st; double A,B,C,Maxx; int main() { while(cin>>q>>n && n) { clr(dp,0);clr(m,0); cnt = 1; for(i=0; i<n; i++) { flag = 0; A = 0;B = 0;C = 0; cin>>num; for(j=0; j<num; j++) { cin>>str>>b>>st; if(str == 'A') A += st; else if(str == 'B') B += st; else if(str == 'C') C += st; else flag = 1; } if(!flag && A<=600 && B<=600 && C<=600 && A+B+C<=1000) //滿足條件的個數 m[cnt++] = A+B+C; } for(i=1; i<cnt; i++) for(j=i-1; j>=0; j--) if(dp[j] + m[i] <= q) dp[i] = max(dp[i],dp[j]+m[i]); Maxx = dp[0]; for(i=1; i<cnt; i++) { Maxx=max(Maxx,dp[i]); } printf("%.2lf\n",Maxx); } }