强烈要求注明数据范围!否则洛谷将会臭名昭著(逃
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;
}