P1926 小书童——刷题大军

image

image

这个题目挺有意思的,有点贪心思想,就是要把更多的时间留给刷题,所以要把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;
}
posted @ 2023-11-11 23:00  yufan1102  阅读(106)  评论(0)    收藏  举报