这是一道很easy的题啦!不过可以引发很多思考耶,一开始还差点被这道题吓住了,不过还好,每一次抽取的纸片都放回了的,并且抽取次数很少,限制条件的范围也比较小,所以直接枚举啦!多的不说,看题!
#include<stdio.h>
int main()
{
int i,n,m,j,k,l,flag;
int a[55];
while(scanf("%d%d",&n,&m)!=EOF)
{
flag=0; //标识是否找到
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
for(k=0;k<n;k++)
{
for(l=0;l<n;l++)
if(a[i]+a[j]+a[k]+a[l]==m)
{
flag=1;
break;//找到方案就跳出循环
}
}
if(flag)
break;//继续跳出
}
if(flag)
break;//继续跳出
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
思考:
1、当n足够大时,显然四重循环不是最优的,要超时(测试通不过),因此还需寻找高效算法(后面会讲)。
2、如果改改题意:每次抽取的纸片不放回且所有元素都不可能相同,那么又该怎样处理?((*^__^*) 嘻嘻……先留给大家思考啦,后面再给讲解!)