题目大意
解题思路
注意这里有放回抽样。
- 普通思路,暴力搜素所有4张卡片组合。
- 复杂度: O ( n 4 ) O(n^4) O(n4),超时。
- 转换思路:
- a + b + c + d = m ⇒ a + b = m − c − d a+b+c+d = m \Rightarrow a+b=m-c-d a+b+c+d=m⇒a+b=m−c−d
- 因此我们先计算出任意两个物品的重量和。这样共有 n 2 n^2 n2个组合,存在数组 a a a中。
- 对 n 2 n^2 n2组合排序。
- 对任意两个 a , b a, b a,b利用二分搜索判断 m − a − b m-a-b m−a−b是否在数组 a a a中。若在,则可以生成。
- 复杂度:
- 排序: O ( n 2 l o g n ) O(n^2logn) O(n2logn)
- 循环搜索: O ( n 2 l o g n ) O(n^2logn) O(n2logn)
代码
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 1005*1005;
int a[MAXN];
int b[MAXN];
int main()
{
int n, m, cnt;
while(cin >> n >> m)
{
cnt = 0;
for(int i=0; i<n; i++)
cin >> b[i];
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
a[cnt++] = b[i]+b[j];
int flag = 0;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(binary_search(a,a+cnt,m-b[i]-b[j]))
flag = 1;
}
}
if(flag)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}
知识点
- STL函数: b i n a r y _ s e a r c h ( a , a + n , k e y ) binary\_search(a, a+n, key) binary_search(a,a+n,key) 的使用。