算法小题之抽签问题
2015-05-06 12:36
323 查看
抽签问题:
你的朋友提议玩一个游戏:将写有数字的n个纸片放入口袋中,你可以从口袋中抽取4次纸片,每次记下纸片上的数字后都将其放回口袋中。如果这4个数字的和是m,就是你赢,否则就是你的朋友赢。
请你编写一个程序,判断当纸片上所写的数字是k1,k2,... ,kn时,是否存在抽取4次和为m的方案。如果存在,输出为Yes;否则,输出为No。
限制条件:
1<=n<=50
1<=m<=10^8
1<=ki<=10^8
样例输入
3 10
1 3 5
第一行代表n,m,第二行代表ki
样例输出:
Yes
例如当4次抽取的结果是1,1,3,5,和就是10
因为n的范围较小,首先想到的便是使用简单的4重循环,及穷举思想。以下是实现代码:
整个算法的时间复杂度是O(n^4),当n值较大时,就应该考虑一下优化问题了。这个优化将在抽取问题(续)中分享与讨论。
注:题目来源:挑战程序设计(第2版)
你的朋友提议玩一个游戏:将写有数字的n个纸片放入口袋中,你可以从口袋中抽取4次纸片,每次记下纸片上的数字后都将其放回口袋中。如果这4个数字的和是m,就是你赢,否则就是你的朋友赢。
请你编写一个程序,判断当纸片上所写的数字是k1,k2,... ,kn时,是否存在抽取4次和为m的方案。如果存在,输出为Yes;否则,输出为No。
限制条件:
1<=n<=50
1<=m<=10^8
1<=ki<=10^8
样例输入
3 10
1 3 5
第一行代表n,m,第二行代表ki
样例输出:
Yes
例如当4次抽取的结果是1,1,3,5,和就是10
因为n的范围较小,首先想到的便是使用简单的4重循环,及穷举思想。以下是实现代码:
/* * this file is to solve the draw_lots problem * compiled by g++ * date:2015-05-06 * version:0.1 * author:zhang */ #include <cstdio> using namespace std; const int MAXN = 50; int main() { int n,m,k[MAXN]; //read the init values scanf("%d %d",&n,&m); for(int i = 0;i < n; i++) { scanf("%d",&k[i]); } int flag=0; //four loops for(int a = 0;a < n; a++) for(int b = 0;b < n; b++) for(int c = 0;c < n; c++) for(int d = 0;d < n; d++) { if(k[a] +k[b] +k[c] +k[d] == m) { flag=1; } } if(flag) { puts("Yes"); } else { puts("No"); } return 0; }
整个算法的时间复杂度是O(n^4),当n值较大时,就应该考虑一下优化问题了。这个优化将在抽取问题(续)中分享与讨论。
注:题目来源:挑战程序设计(第2版)
相关文章推荐
- 抽签问题的思考(二分算法)
- 算法题--抽签问题的思考与解决
- 抽签问题改进算法
- 算法起步(3)抽签问题—合二为一(下)
- 算法起步(3)抽签问题—合二为一(上)
- 算法作业-统计数字问题&字典序问题&最多约数问题
- 夜深人静写算法(十)- 有向图强连通和2-sat问题
- 算法导论-最大子数组问题-线性时间复杂度算法分析与实现
- 经典算法之二维数组中的查找问题
- 格子取数问题,完美洗牌算法
- 最大m子段和问题算法进化历程
- 算法基础问题列表
- 蓝桥杯 算法训练 Anagrams问题
- [算法] 最长公共子序列(LCS)问题
- 贪心算法-泊松分酒问题
- 【初级算法剖析】超大文件获取顺序相关数据问题
- 算法-网易笔试 台阶石板约数问题(回退)
- 算法导论之最大子数组问题 C语言实现
- 算法思维问题,请大家指教!!!
- 第四章 分治策略 4.1 最大子数组问题 (暴力求解算法)