这个题目挺有意思的,有点贪心思想,就是要把更多的时间留给刷题,所以要把01背包改成取min,所以要把dp[i]先预处理成0x3f无穷大,然后把刷题时间排个序,这要就是最佳的答案。
#include<bits/stdc++.h>
using namespace std;
int a[20],b[20],c[20];
int f[100];
int main(){
int n,m,k,r;
cin>>n>>m>>k>>r;
for(int i=1;i<=n;i++){
cin>>c[i];
}
sort(c+1,c+1+n);
for(int i=1;i<=m;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
cin>>b[i];
}
memset(f,0x3f,sizeof f);
f[0]=0;
for(int i=1;i<=m;i++){
for(int j=k;j>=b[i];j--){
f[j]=min(f[j],f[j-b[i]]+a[i]);
}
}
int h=r-f[k];
int ans=0;
for(int i=1;i<=n;i++){
if(h>=c[i]){
ans++;
h-=c[i];
}else{
break;
}
}
cout<<ans;
return 0;
}
标签:0x3f,20,P1926,int,小书童,ans,刷题
From: https://www.cnblogs.com/yufan1102/p/17826539.html