百度之星 Problem B

题面

小沃沃一共参加了 4 门考试,每门考试满分 100 分,最低 0 分,分数是整数。

给定四门考试的总分,请问在最优情况下,四门课绩点的和最高是多少?

分数与绩点之间的对应关系如下:

95~100 4.3

90~94 4.0

85~89 3.7

80~84 3.3

75~79 3.0

70~74 2.7

67~69 2.3

65~66 2.0

62~64 1.7

60~61 1.0

0~59 0

Input
第一行一个正整数 test(1≤test≤401) 表示数据组数。
接下来 test 行,每行一个正整数 x 表示四门考试的总分 (0≤x≤400)。

Output
对于每组数据,一行一个数表示答案。答案保留一位小数。

Sample Input
2
0
400

Sample Output
0.0
17.2

思路

直接暴力就可以了,可以dfs和可以写个简单dp枚举状态。

代码实现

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<queue>
#include<cstring >
#include<cmath>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn=20; 

double point [105];
double dp[4][405];

int main () {
    memset (dp,0,sizeof (dp) );

    for (int i=0;i<=100;i++) {
        if (i>=95&&i<=100) point [i]=4.3;
        else if (i>=90&&i<=94) point[i]=4.0;
        else if (i>=85&&i<=89) point[i]=3.7;
        else if (i>=80&&i<=84) point[i]=3.3;
        else if (i>=75&&i<=79) point[i]=3.0;
        else if (i>=70&&i<=74) point[i]=2.7;
        else if (i>=67&&i<=69) point[i]=2.3;
        else if (i>=65&&i<=66) point[i]=2.0;
        else if (i>=62&&i<=64) point[i]=1.7;
        else if (i>=60&&i<=61) point[i]=1.0;
        else point[i]=0.0;
    }

    for (int i=1;i<=4;i++)
     for (int j=0;j<=100*i;j++)
      for (int k=0;k<=min (100,j);k++) {
          dp[i][j]=max (dp[i][j],dp[i-1][j-k]+point[k]);
      }
    
    int t,x;
    cin>>t;
    while (t--) {
        cin>>x;
        printf ("%.1lf
",dp[4][x]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/hhlya/p/13348140.html