题目链接:https://ac.nowcoder.com/acm/contest/303/D
题目大意:有7个基地,每个基地都有一个能够抵挡异虫攻击的最小兵力需求L[i],同时每个基地因为有固定的人口上限,分配给该基地的兵力也不得大于上限R[i]。现在需要将n个兵力完全分配,如果有多余的兵力剩余则任务失败,输出0。问最多能保全几个基地。
思路:二进制枚举,对于每种情况记录最少需要人数和最多分配人数,只要n处于二者中间即可完全分配,更新答案。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t,n,sumL,sumR;
int ans,cnt;
struct node {
ll l,r;
}P[7];
int main()
{
scanf("%lld",&t);
while(t--){
ans=0;
scanf("%lld",&n);
for(int i=0;i<7;i++){
scanf("%lld%lld",&P[i].l,&P[i].r);
}
for(int s=0;s<(1<<7);s++){
sumL=sumR=0;
cnt=0;
for(int i=0;i<7;i++){
if(s&(1<<i)){
sumL+=P[i].l;
sumR+=P[i].r;
cnt++;
}
}
if(sumL<=n&&n<=sumR){
ans=max(ans,cnt);
}
}
printf("%d\n",ans);
}
}