问题描述:
给出 n 个正整数 ai ,从中选出 k 个数,求出这 k 个数的和。
问:所有的和中,有多少个互不相同的回文数,并从小到大输出这些为回文数的和。
输入描述:
第 1 行两个正整数 n 和 k ,
第 2 行 n 个正整数 ai 。
输出描述:
第 1 行一个整数 ans ,表示互不相同的回文数一共有多少个。
第 2 行有 ans 个从小到大的回文数。
输入样例:
4 2
3 4 5 6
输出样例:
4
7 8 9 11
数据范围:
30% 的数据: n≤10,k=2 ;
80% 的数据: n≤20,k≤10 ;
100% 的数据: n≤26,k≤n,sum≤2×109
(sum指所有数字之和)
下面是我的代码:
#include<bits/stdc++.h>
using namespace std;
int n,k,a[27],s[100001],ans;
bool hws(int n){
int m=0,ans=n;
for(;n;n/=10)m=(m<<1)+(m<<3)+n%10;
return ans==m;
}
void dfs(int now,int sum,int last){
if(now>k){
if(hws(sum))s[++ans]=sum;
return;
}
for(int i=last+1;i<=n;i++)dfs(now+1,sum+a[i],i);
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i];
dfs(1,0,0);
sort(s+1,s+ans+1);
int answer=unique(s+1,s+ans+1)-s-1;
cout<<answer<<endl;
for(int i=1;i<=answer;i++)cout<<s[i]<<' ';
return 0;
}
TLE 了最后一个测试点,有谁帮我优化一下代码?