题意:
给你一个平均分ave,给你一个科目n,求最大积点和最小积点值
n<=10;
方法:
设总分为sum= ave*n
则最大总积点为dp[sum][i]= max(dp[sum- k][i-1] + k分对应的积点) 其中k>= 60 && k<=100 && sum-k>=(i-1)*60 && sum-k<=(i-1)*100 即可
同理可求出最小积点
代码:
#include <cstdio>
#include <cstring>
double dp[1005][12];
double d[1005][12];
double GPA(int x)
{
if(x<= 69)
return 2.0;
else if(x<= 74)
return 2.5;
else if(x<= 79)
return 3.0;
else if(x<= 84)
return 3.5;
return 4.0;
}
double max(double x, double y)
{
return x> y? x: y;
}
double min(double x, double y)
{
return x< y? x: y;
}
int main()
{
memset(dp, 0, sizeof(dp));
for(int i= 0; i<= 1000; i++)
for(int j= 0; j<= 10; j++)
d[i][j]= 50;
for(int i= 60; i<= 100; i++)
dp[i][1]= d[i][1]= GPA(i);
for(int i= 2; i<= 10; i++)
for(int j= i*60; j<= i*100; j++)
for(int k= 60; k<= 100; k++)
{
int sum= j- k;
if(sum>= (i-1)*60 && sum<= (i-1)*100)
{
dp[j][i]= max(dp[j][i], dp[sum][i-1]+ GPA(k));
d[j][i]= min(d[j][i], d[sum][i-1]+ GPA(k));
}
}
int T;
scanf("%d",&T);
while(T--)
{
int ave, n;
scanf("%d %d",&ave, &n);
printf("%.4lf %.4lf\n", d[ave*n][n]/n, dp[ave*n][n]/n);
}
return 0;
}