hdu4968Improving the GPA dp

//給定平均分和科目數量,
//求平均績點的最大值和最小值。
//dp[0/1][i][j] 表示i们课,总分为j的最小/大值
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std  ;
const int maxn = 1010 ;
const int inf = 1e8 ;
double dp[2][20][maxn] ;
double c[maxn] ;
int main()
{
    int t ;
    scanf("%d" , &t) ;
    for(int i = 60;i<=69;i++)
    c[i] = 2.0 ;
    for(int i = 70;i <= 74;i++)
    c[i] = 2.5 ;
    for(int i = 75;i <= 79;i++)
    c[i] = 3.0 ;
    for(int i = 80;i <= 84;i++)
    c[i] = 3.5 ;
    for(int i = 85;i <= 100;i++)
    c[i] = 4.0 ;
    while(t--)
    {
        int n ,ss ;
        scanf("%d%d" ,&ss , &n) ;
        int m = ss*n ;
        for(int i = 0;i <= n;i++)
            for(int j = 0;j <= m;j++){
                dp[0][i][j] = inf ;
                dp[1][i][j] = -inf ;
            }
        dp[0][0][0] = dp[1][0][0] = 0 ;
        for(int i = 1;i <= n;i++)
            for(int j = 60;j <= m;j++)
                for(int k = 60;k <= min(j,100);k++){
                    dp[0][i][j] = min(dp[0][i][j],dp[0][i-1][j-k]+c[k]) ;
                    dp[1][i][j] = max(dp[1][i][j],dp[1][i-1][j-k]+c[k]) ;
                }
        printf("%.4lf %.4lf\n" ,dp[0][n][m]/n , dp[1][n][m]/n) ;
    }
    return 0 ;
}

你可能感兴趣的:(hdu4968Improving the GPA dp)