测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A41794. 帮助

填空题 困难

题目描述

帮助

题目描述:

已知有M名需要帮助的贫困学生,及每名学生购买图书的金额;和N位愿意提供帮助的志愿者,及每名志愿者愿意帮助的金额。

现N名志愿者认领贫困生进行帮助,每人可以认领贫困学生的名额不限,但如果志愿者愿意帮助的金额小于每名贫困生购买图书的金额,那么该志愿者不能认领贫困学生。请你计算出这些志愿者最多可以认领多少名贫困学生(一名学生只能被一名志愿者认领)。

例如:M=5,N=2

5名贫困学生购买图书金额分别是:200、145、240、50、45,2名志愿者帮助金额分别为150、300。则最多可以认领4名学生。(金额300的志愿者认领200、50、45这3名学生,金额150的志愿者认领145这1名学生)

输入描述:

第一行输入一个正整数M(1<M<200),表示有M名贫困学生

第二行输入M个正整数(10<正整数<300),表示每名贫困生需要购买的图书金额,正整数之间一个空格隔开

第三行输入一个正整数N(1<N<50),表示有N名志愿者

第四行输入N个正整数(10<正整数<10000),表示N名志愿者帮助的金额,正整数之间一个空格隔开

输出描述:

输出一个整数,表示N名志愿者最多可以认领多少名贫困学生

样例输入:

5

200 145 240 50 45

2

150 300

样例输出:

4

参考答案

#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int m,n,a[205],b[55],cnt; void dfs(int p,int sum){ if(p>m) return; for(int i=1;i<=n;i++){//被选走的情况 if(b[i]>=a[p]){ b[i]-=a[p]; cnt=max(cnt,sum+1); dfs(p+1,sum+1); b[i]+=a[p]; } } dfs(p+1,sum);//不选的情况 } int main() { cin>>m; for(int i=1;i<=m;i++) cin>>a[i]; cin>>n; for(int i=1;i<=n;i++) cin>>b[i]; dfs(1,0);//从第1本书开始搜索,已赞助0人 cout<<cnt<<endl; return 0; }
上一题 下一题