CODE (暴力代码)
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+7;
int T,n,m,sum,a[N],b[N],minn=1e18;
void dfs(int step,int sum,int sum1){
if(step>n){
if(sum>=m) minn=min(minn,sum1);
return;
}
dfs(step+1,sum+a[step],sum1+b[step]);
dfs(step+1,sum,sum1);
return;
}
signed main(){
// freopen("clean.in","r",stdin);
// freopen("clean.out","w",stdout);
cin>>T;
while(T--){
sum=0,minn=1e18;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
sum+=a[i];
}
if(m>sum){
cout<<-1<<endl;
continue;
}
if(m==sum){
cout<<sum<<endl;
continue;
}
for(int i=1;i<=n;i++) cin>>b[i];
dfs(1,0,0);
cout<<minn<<endl;
}
return 0;
}
Problem
小a经常使用他的手机,现在他的手机上正运行着 n 个应用程序,第 i 个应用程序占用 ai 内存单元。现在他的手机有些卡顿,他希望能够让手机释放至少 m 个内存单元(通过终止一些应用程序)。
但是,有些应用程序对小a来说比其他应用程序更加重要,现在他将应用程序的优先级分为两类:如果一个应用程序的优先级为 bi=1 ,表示这是一个普通的程序;如果一个应用程序的优先级为 bi=2 ,表示这是一个非常重要的应用程序。
根据这个优先级系统,他的手机将有 b1+b2+...+bn 分数。
现在小a打算终止一些应用程序,这些应用程序的编号为 i1,i2,...,ik ,这样,他的手机将会释放 ai1+ai2+...+aik 的内存,而且还会失去 bi1+bi2+...+bik 的分数。
请你帮助小a选择终止一些应用程序,使得他的手机能够至少释放 m 的内存,并且损失的分数最少;如果无法做到,则输出 −1。
第一行一个正整数 T 表示数据组数。
对于每一组数据,第一行两个整数 n,m ,分别表示此时运行的应用程序的数量,以及至少释放的内存数。
第二行包含 n 个整数,第 i 个数为 ai ,表示这个程序所占的内存数。
第三行包含 n 个整数,第 i 个数为 bi ,表示这个程序的分数。
输出包含 T 行,如果能够使得小a的手机释放至少 m 内存的方法,那么输出这些方法中损失分数最少的数量;如果不存在这样的方法,则输出 −1 。
2
5 7
5 3 2 1 4
2 1 1 2 1
4 4
1 1 2 1
1 2 1 2
2
4
解释#1
对于第一组数据部分可选的方案如下:
最终所有的情况下,最少损失的分数为 2 。
对于第二组数据:
终止应用 1,2,3 ,释放 a1+a2+a3=4 的内存,损失 b1+b2+b3=4 的分数。
数据范围
对于 20% 的数据,保证 1≤n≤10, 1≤T≤103 。
对于另外 30% 的数据,保证 1≤n≤102, 1≤T≤102 。
对于 100% 的数据,保证 1≤n≤105, 1≤T≤5, 1≤ai,bi≤109 。