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

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

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

#include<bits/stdc++.h>
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值