算法学习笔记之抽签
抽 签
你的朋友提议玩一个游戏:将写有数字的n 个纸片放入口袋中,你可以从口袋中抽取4 次纸
片,每次记下纸片上的数字后都将其放回口袋中。如果这4 个数字的和是m,就是你赢,否
则就是你的朋友赢。你挑战了好几回,结果一次也没赢过,于是怒而撕破口袋,取出所有纸
片,检查自己是否真的有赢的可能性。请你编写一个程序,判断当纸片上所写的数字是k1,
k2, …, kn 时,是否存在抽取4 次和为m 的方案。如果存在,输出Yes;否则,输出No。
限制条件
1 ≤ n ≤ 50
1 ≤ m ≤ 108
1 ≤ ki ≤ 108
输入
n = 3
m = 10
k = {1, 3, 5}
输出
Yes(例如4次抽取的结果是1、1、3、5,和就是10)
答案:
1 // suanfa.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 6 const int MAX_N=50; 7 8 int _tmain(int argc, _TCHAR* argv[]) 9 { 10 int n,m,k[MAX_N]; 11 12 scanf("%d %d",&n,&m); 13 for(int i=0;i<n;i++) 14 { 15 scanf("%d",&k[i]); 16 } 17 18 bool f=false; 19 20 for (int a=0;a<n;a++) 21 { 22 for (int b=0;b<n;b++) 23 { 24 for (int c=0;c<n;c++) 25 { 26 for (int d=0;d<n;d++) 27 { 28 if (k[a]+k[b]+k[c]+k[d]==m) 29 { 30 f=true; 31 } 32 } 33 } 34 } 35 } 36 37 if (f) 38 { 39 puts("Yes"); 40 } 41 else 42 { 43 puts("No"); 44 } 45 46 return 0; 47 }
四重for循环做了一个简单的穷举