链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
小波奇由于冲动消费,不小心买多了章鱼仙贝,买了一共m份章鱼仙贝,于是她只能把这些仙贝分给n位朋友。
小波奇日常想太多,她认为分仙贝时好感度的变化是有规律的,不过并不是给的仙贝越多,好感度上升的就越多,而是应该看小波奇给出的仙贝数与她当前手里总仙贝的比值。也就是说,若小波奇当前还剩x(x>0)个仙贝,并给了一位朋友y个仙贝(x,y都为整数),则这位朋友对小波奇的好感度将增加y/x(这个值可以为小数)。
现在,小波奇可以任意安排送仙贝的顺序和每次送仙贝的个数,但不能给同一个人送两次仙贝,允许最后手中还有剩余的仙贝,允许最终有朋友没有分到仙贝。社恐的朋友非常重要,所以请你帮助小波奇算一算,在最优送仙贝策略下,小波奇和所有人的好感度之和最大为多少(假设初始小波奇和所有人好感度都为0)。输入描述:
输入包括两个整数n,m(1≤n,m≤500),表示小波奇的朋友数和仙贝数。输出描述:
输出问题的答案,即小波奇与朋友们的好感度之和的最大值,考虑到可能存在的浮点误差,你的答案与标准答案的相对误差若10−6之内,就将被判为正确。示例1
输入
3 31.833333333说明
对应的分配方案是:小波奇初始有3个仙贝,给第一个朋友1块,收获了1/3的好感度;现在小波奇有2个仙贝,给第二个朋友1块,收获了1/2的好感度;最后,小波奇把最后一块仙贝给了第三个朋友,收获了1/1的好感度。因此,总好感度为1/6,并且可以看出没有更好的分配方案。
dp[i][j],表示前i个人分了j个 东西,k表示当前这个人分了k,
#include <iostream>
using namespace std;
constexpr int N=510;
int n,m;
double dp[N][N];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=0;j<=m;j++){
for(int k=0;k<=j;k++){
dp[i][j]= max(dp[i][j],dp[i-1][j-k]+(double)k/(m-(j-k)));
}
}
}
printf("%.9f",dp[n][m]);
}