二进制大暴力
谁能解释下不排序为什么会超时??
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int N,G[50],n,k;
ll W,cnt[1<<23],cnt2[1<<23],ans;
int main()
{
cin>>W>>N;
for(int i=0;i<N;i++)
cin>>G[i];
sort(G,G+N); //不排序超时,排序后能过
n=N/2;
for(int i=0;i<(1<<n);i++)
{
ll sumw=0;
for(int j=0;j<n;j++)
if((i>>j)&1)
sumw+=G[j];
cnt[i]=sumw;
}
sort(cnt,cnt+(1<<n));
cnt2[0]=cnt[0];
for(int i=1;i<(1<<n);i++)
if(cnt[i]!=cnt[i-1])
cnt2[++k]=cnt[i];
for(int i=0;i<(1<<(N-n));i++)
{
ll sumw=0;
for(int j=N-n-1;j>=0;j--)
if((i>>j)&1)
{
sumw+=G[n+j];
if(sumw>W)
break;
}
if(sumw>W) continue;
int num=upper_bound(cnt2,cnt2+k+1,W-sumw)-cnt2;
ll tv=cnt2[num-1];
ans=max(ans,sumw+tv);
}
cout<<ans;
return 0;
}
你知道新出的应用网址在哪里吗?
主页左下角图标点出来,应用里