试题描述
|
输入
|
输出
|
输入示例
|
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的四次方,这样的算法肯定是不行的。于是思考了一种优化方式,先进行排序,然后选择是否要进入下一层训话,这样子,时间复杂度有所降低,但是不稳定,不知道还有没有更好的优化方法,希望可以学习,欢迎大家留言评论