<span style="font-size:18px;"></span><pre name="code" class="cpp">原始代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=50;
int main()
{
int n,m,k[maxn];
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%d",&k[i]);
}
bool f=false;
for(int a=0;a<n;a++)
for(int b=0;b<n;b++)
for(int c=0;c<n;c++)
for(int d=0;d<n;d++)
{
if(k[a]+k[b]+k[c]+k[d]==m)
{
f=true;
}
}
if(f)
puts("Yes");
else
puts("No");
return 0;
}
<span style="font-size:18px;"></span><pre name="code" class="cpp">第一次优化,k[d]=m-k[a]-k[b]-k[c],搜索k[d]的值就可以
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=10000;
int n,m,k[maxn];
bool binary_search(int x)
{
int l=0,r=n;
while(r-l>=1)
{
int i=(l+r)/2;
if(k[i]==x)
return true;
else if(k[i]<x)
l=i+1;
else
r=i;
}
return false;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d",&k[i]);
sort(k,k+n);
bool f=false;
for(int a=0;a<n;a++)
{
for(int b=0;b<n;b++)
{
for(int c=0;c<n;c++)
{
if(binary_search(m-k[a]-k[b]-k[c]))
f=true;
}
}
}
if(f)
puts("Yes");
else
puts("No");
return 0;
}
<span style="font-size:18px;">二次优化,k[d]+k[c]=m-k[a]-k[b],找出 </span><span style="font-size: 18px; font-family: Arial, Helvetica, sans-serif;">k[d]+k[c]所得的数字,然后搜索</span>
<span style="font-size:18px;">#include <iostream>
#include<algorithm>
using namespace std;
int k[100];
int kk[100];
int n;
bool f;
bool binary_search(int x)
{
int l = 0, r = n;
int mid;
while(l < r)
{
mid = (l+r)/2;
if(kk[mid] == x)
return true;
else if(x < kk[mid])
r = mid - 1;
else
l = mid + 1;
}
return false;
}
int main()
{
int m;
cin >> n >> m;
for(int i=0; i<n; i++)
{
cin >> k[i];
}
int a, b, c, d;
for(int c=0; c<n; c++)
{
for(int d=0; d<n; d++)
{
kk[c*n + d] = k[c] + k[d];
}
}
sort(kk,kk+n*n);
for(a=0; a<n; a++)
{
for(b=0; b<n; b++)
{
if(binary_search(m-k[a]-k[b]))
f = true;
}
}
if(f)
cout << "Yes\n";
else
cout << "No\n";
return 0;
} </span>