题目背景
无
题目描述
给定一个数组,长度为n,当数组内t(t>=2&&t<n)个数相加之和等于数组内的某个数时记录下这个数和t,把所有符合的值求和(对于1+2=3和2+1=3属于一种情况,不允许进行重复运算)并记录所有的t值,数据保证数组内任意两个数都不相等,且每个数都0<a[i]<100.
输出数总和。
输入输出格式
输入格式:
第一行一整数n
第二行n个数,表示给定数组
输出格式:
两个数用空格隔开,分别代表求和数量和所有满足条件t相加的值
输入输出样例
输入样例#1:
6 1 2 3 4 5 6
输出样例#1:
35 15
说明
4
1 2 3 4
有1+2=3,1+3=4;
输出 7 4,
7=3+4, 4=四个加数(1+2, 1+3)
题解: 有些东西能看懂和能做出来真的是两种区别,做这道题就深深的让我体会到那种无助的感觉, = = ,搜索看过几道题,自认为看懂了,但要熟练的运用,一两道题是不够的,想要理解也得多做题啊,,
#include<iostream>
#include<string.h>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
int sum,num,n;
int a[1000000];
int vis[1000000];
int t[1000000];
int d,s; //临时存的总数 和 个数
int ma=0;
void dfs(int x)
{
if(t[s]==1&&d>=2){
num+=d;sum+=s;
}
else if(s>ma||x>=n) return;
for(int i=x;i<n;i++){
s+=a[i];
d+=1;//数字的和
dfs(i+1);
s-=a[i];
d-=1;
}
}
int main()
{
cin>>n;
memset(t,0,sizeof(t));
for(int i=0;i<n;i++){
cin>>a[i];
t[a[i]]=1;
if(a[i]>ma) ma=a[i];
}
dfs(0);
cout<<sum<<" "<<num<<endl;
return 0;
}