算法问题

来源:互联网 发布:Linux修改进程名字 编辑:程序博客网 时间:2024/06/08 16:48





试题描述

你的朋友提议玩一个游戏:将写有数字的n 个纸片放入口袋中,你可以从口袋中抽取4 次纸片,每次记下纸片上的数字后都将其放回口袋中。如果这4 个数字的和是m,就是你赢,否则就是你的朋友赢。你挑战了好几回,结果一次也没赢过,于是怒而撕破口袋,取出所有纸片,检查自己是否真的有赢的可能性。请你编写一个程序,判断当纸片上所写的数字是k1,k2, …, kn 时,是否存在抽取4 次和为m 的方案。

输入
第一行为两个整数n,m;第二行为n个整数k1,k2, …, kn 。
输出
如果存在,输出“Yes”;否则,输出“No”。
输入示例
3 10
1 3 5
输出示例
Yes




#include<iostream>#include <algorithm>using namespace std;int main(){int n,m;int i,j,k,l,sum=0; int a[100];scanf("%d%d",&n,&m);for(i=0;i<n;i++){scanf("%d",&a[i]);}//数据存放sort(a,a+n);//数据排序for(i=0;i<n;i++){sum+=a[i];if(sum>=m){sum=0;break;}for(j=0;j<n;j++){sum+=a[j];if(sum>=m){break;}for(k=0;k<n;k++){sum+=a[k];if(sum>=m){break;}for(l=0;l<n;l++){sum+=a[l];if(sum>m){break;}if(sum==m){cout<<"YES\n"<<endl; return 0;}sum-=a[l];}sum-=a[k];}sum-=a[j];}sum=0; } 
cout<<"NO"<<endl;return 0;}
看到网上关于这道题的csdn博客,大都直接用了四个循环,这样子时间复杂度为n的四次方,这样的算法肯定是不行的。于是思考了一种优化方式,先进行排序,然后选择是否要进入下一层训话,这样子,时间复杂度有所降低,但是不稳定,不知道还有没有更好的优化方法,希望可以学习,欢迎大家留言评论