Description
#include<stdio.h>
int n,m,z,v=0;//n表示个数,m表示总值,z表示与总值的差值
int q=n*n;//抽两次的所有可能
int enter(int k[])
{
printf("分输入抽签个数,需要抽到的总值,与抽签的具体值\n");
scanf("%d",&n);//输入纸条个数
scanf("%d",&m);//需要求出的值
for(int i;i<n;i++)
scanf("%d",&k[i]);
}
int Integration(int k[],int kk[])//合并
{int a,b,i=0;
for( a=0;a<n;a++)
for(b=0;b<n;b++)
{i++;kk[i]=k[a]+k[b];}//抽两次之和放在一个数组里
}
int array(int kk[])//把抽到的两个数可能之和从小到大排序
{
int i,l;
for(i=0;i<n;i++)
for(l=i+1;l<n;l++)
if(kk[i]>kk[l])
{ kk[i]^=kk[l];kk[l]^=kk[i];kk[i]^=kk[l];}//交换数据
}
int points(int kk[])//分治
{int p=0;int x;
for(int a=0;a<n;a++)
for(int b=0;b<n;b++)
{z=m-kk[a]-kk[b];//抽完两次还差的值
while(kk[p+q]!=0)
{x=kk[(p+q)/2];
if(z+x==m) return 1;
else if(n>m) q=x;
else if(n<m) p=x;}}
return 0;
}
main()
{
int k[n];
int kk[n];
enter(k);//输入
Integration(k,kk);//合并
array(kk);//排序
v=points(kk);//分治
if(v==1)
printf("Yes");
else
printf("No");
}