P1926 小书童——刷题大军 题解
#include<iostream> #include<algorithm> using namespace std; int dp[200]; int a[20],b[20],c[20]; int n,m,k,r; int main() { cin>>n>>m>>k>>r; for (int i=1;i<=n;i++) { cin>>c[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--) { dp[j]=max(dp[j],dp[j-a[i]]+b[i]); } } int t; for (t=1;t<=r;t++) { if (dp[t]>=k) break; } sort(c+1,c+n+1); r=r-t; int ans=0; for (int i=1;i<=n;i++) { if (r>=c[i]) { r=r-c[i]; ans++; } else { break; } } cout<<ans<<endl; return 0; }