这种算法的复杂度达到了O(2^n)
要不要猜猜是什么
没错,就是大名鼎鼎的二进制枚举!
纯二进制枚举是会TLE的
纯二进制枚举
期望得分:80tps
const int N=3e1+10;
int n,v;
pair<int,int> a[N];
int ct,res,ans,b,c;
void solve()
{
cin>>n>>v;
up(i,0,n-1,1){
cin>>a[i].first>>a[i].second;
}
ans=INT_MAX;
for(int i=0;i<(1<<n);i++){
ct=0;
res=0;
b=0;
c=0;
for(int j=0;j<n;j++){
if(((i>>j)&1)==1){
ct+=a[j].first+a[j].second;
res++;
b+=a[j].first;
c+=a[j].second;
}
}
if(ct>v){
ans=min(ans,abs(b-c));
}
}
if(ans==INT_MAX){
ans=-1;
}
cout<<ans;
return;
}
当答案不能更优时,也就是当前的好感值只差为0时,我们直接退出循环
期望得分:100tps
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define up(i,j,k,l) for(int i=j;i<=k;i+=l)
#define down(i,j,k,l) for(int i=j;i>=k;i-=l)
using namespace std;
const int N=3e1+10;
int n,v;
pair<int,int> a[N];
int ct,res,ans,b,c;
void solve()
{
cin>>n>>v;
up(i,0,n-1,1){
cin>>a[i].first>>a[i].second;
}
ans=INT_MAX;
for(int i=0;i<(1<<n);i++){
ct=0;
res=0;
b=0;
c=0;
for(int j=0;j<n;j++){
if(((i>>j)&1)==1){
ct+=a[j].first+a[j].second;
res++;
b+=a[j].first;
c+=a[j].second;
}
}
if(ct>v){
ans=min(ans,abs(b-c));
if(ans==0){
break;
}
}
}
if(ans==INT_MAX){
ans=-1;
}
cout<<ans;
return;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int _=1;
up(i,1,_,1){
solve();
}
return 0;
}