洛谷 P1926 【小书童——刷题大军】

强烈要求注明数据范围!否则洛谷将会臭名昭著(逃

01背包求出最短要多少时间及格,然后贪心给题目排序,从时间少的开始做起

#include
using namespace std;
int f[157],a[17],b[17];//最大数据给出的时间是150
//所以原来f开107本地过了,然而洛谷IDE挂了,并不知道为什么
//f存每个时间内得到的最大分数,a是作业时间,b是作业分数

int ex[17];//题目时间
int n,m,k,r;
int tim;
int ans;
int main(){
    cin>>n>>m>>k>>r;
    for(int i=1;i<=n;++i)
        cin>>ex[i];
    for(int i=1;i<=m;++i)
        cin>>a[i];
    for(int i=1;i<=m;++i)
        cin>>b[i];
    for(int i=1;i<=m;++i)
        for(int j=r;j>=a[i];--j)
            f[j]=max(f[j],f[j-a[i]]+b[i]);
            //01背包 求出在i时间内,能够达到的最大分数
    for(int i=0;i<=r;++i)//个人觉得应该从0开始判断,防止特殊数据
        if(f[i]>=k){//当前时间已经及格了
            tim=r-i;//不用再做作业了
            break;//跳出循环
        }
    sort(ex+1,ex+n+1);//贪心,从小到大排序
    for(int i=1;i<=n;++i)
        if(tim>=ex[i]){//如果还来得及做
            ans++;//做了一题
            tim-=ex[i];//减去这题的时间
        }
    cout<<ans<<endl;//一共做了几题
    return 0;
}

你可能感兴趣的:(题解)