一个袋子中有 nn 个数字纸片,每张上面都写了一个数字。
我们有 44 次机会,每次从袋子中选一个纸片,记录下数字,然后放回去(因此一个纸片可能多次被选中)。
当存在一个可能,使得 44 张纸片的数字总和等于 mm,则输出 Yes
,否则输出 No
输入
- 第一行输入整数 n(1 \leq n \leq 1000)n(1≤n≤1000)
- 第二行输入整数 m(1 \leq m \leq 10^8)m(1≤m≤108)
- 第三行输入 nn 个整数,表示每个纸片上的数字 k_i(1 \leq k_i \leq 10^8)ki(1≤ki≤108)
输出
- 一行,
Yes
或No
样例 1
输入
3 10 1 3 5
输出
Yes
//n^2logn
#include<bits/stdc++.h>
using namespace std;
int k[1001];
int kk[10000001];
int n,m;
// bool binary_search(int x)
// {
// int low=0,high=n-1,mid;
// while(high-low>=1)
// {
// mid=(high+low)/2;
// if(kk[mid]==x) return true;
// else if(kk[mid]>x) high=mid-1;
// else low=mid+1;
// }
// return false;
// }
int main()
{
cin >> n>> m;
for(int i=0;i<n;i++)
cin>>k[i];
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(int a=0;a<n;a++)
for(int b=0;b<n;b++)
{
if(binary_search(kk,kk+n*n,m-k[a]-k[b]))
{
puts("Yes");
return 0;
}
}
puts("No");
}