HDU 4968 Improving the GPA

五一劳动节的练习题。

队友看出来是一个背包,另外一个队友提供了贪心思路ac,在场上想了怎么背,没想出来。

然后看题解,结合自己遇到当时的情况,发现用二维数组,一个表示物品的数量一个表示物品的重量,那么就比较好写了

#include<bits/stdc++.h>
using namespace std;
//const int va[]={85,80,75,70,60};
//const int vb[]={100,84,79,74,69};
//const double w[]={4.0,3.5,3.0,2.5,2.0};
double v[110];
int cnt;
double ma[20][1010];
double mi[20][1010];
int main()
{
    //freopen("i.txt","r",stdin);
    for(int i=85; i<=100; i++)//预先处理
        v[i]=4.0;
    for(int i=80; i<=84; i++)
        v[i]=3.5;
    for(int i=75; i<=79; i++)
        v[i]=3.0;
    for(int i=70; i<=74; i++)
        v[i]=2.5;
    for(int i=60; i<=69; i++)
        v[i]=2.0;
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int weight;
        int k;
        scanf("%d%d",&weight,&k);
        weight*=k;
        for(int i=0;i<k;i++)
        {
            for(int j=0;j<=weight;j++)
            {
                ma[i][j]=0;
                mi[i][j]=0x3f3f3f;//把最大值最小值设置一下
            }
        }
        for(int i=60;i<=100;i++)
        {
            ma[0][i]=v[i];
            mi[0][i]=v[i];
        }
        for(int i=1;i<k;i++)
        {
            for(int j=60;j<=100;j++)
            {
                for(int n=0;n<=weight;n++)
                {
                    if(n-j>=0&&ma[i-1][n-j]!=0)这个条件防止 重量59价值为0这种不存的情况被算入
                    ma[i][n]=max(ma[i-1][n-j]+v[j],ma[i][n]);//更新
                }
            }
        }
        for(int i=1;i<k;i++)
        {
            for(int j=60;j<=100;j++)
            {
                for(int n=0;n<=weight;n++)
                {
                    if(n-j>=0&&mi[i-1][n-j]!=0x3f3f3f)
                    mi[i][n]=min(mi[i-1][n-j]+v[j],mi[i][n]);
                }
            }
        }
        printf("%.4f %.4f\n",mi[k-1][weight]/k*1.0,ma[k-1][weight]/k*1.0);
    }
    return 0;
}

当然这题数据范围太小了 直接打出来ma【2-10】【120-1000】是最好的方法

猜你喜欢

转载自www.cnblogs.com/ncc62497/p/8982569.html
GPA
今日推荐