CodeForces - 1459D(dp)

90nwyn

2020-12-19 23:31:20

Personal

[题目链接](https://vjudge.net/problem/CodeForces-1459D) ------------ $dp[i][j][k]$为在前$i$个杯子中,选了$j$个杯子,其总容量为$k$时,水量总和的最大值(不考虑进行任何操作) ------------ ```cpp #include <bits/stdc++.h> typedef double db; using namespace std; const int M=105; int n,a[M],b[M],dp[M][M*M],tot,sum; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d",&a[i],&b[i]); tot+=a[i];sum+=b[i]; } for(int i=0;i<=n;i++)for(int j=0;j<=tot;j++)dp[i][j]=-0x3f3f3f3f; dp[0][0]=0; for(int i=1;i<=n;i++) for(int j=i;j>=1;j--) for(int k=tot;k>=a[i];k--) dp[j][k]=max(dp[j][k],dp[j-1][k-a[i]]+b[i]); for(int i=1;i<=n;i++) { db res=0; for(int j=1;j<=tot;j++) res=max(res,min((db)j,(db)dp[i][j]/2+(db)sum/2)); printf("%.9lf ",res); } return 0; } ```