#include<bits/stdc++.h>
using namespace std;
int a[40];
int sum;
int temp;
bool cmp(const int a,const int b)
{
return a > b;
}
void dfs(int num,int now,int x){
if (num == now){
sum++;
return;
}
for (int i = x+1;i <= temp;i++){
if (num >= now+a[i]){
dfs(num,now+a[i],i);
}
}
}
int main()
{
int n;
cin>> n;
while (n--){
sum = 0;
cin>> temp;
for (int i = 1;i <= temp;i++){
cin >> a[i];
}
sort(a+1,a+temp+1,cmp);
for (int i = 1;i <= temp;i++){
dfs(a[i],0,i);
}
cout << sum<<endl;
}
return 0;
}
加等式
题目描述
对于一个整数集合,我们定义“加等式”如下:集合中的某一个元素可以表示成集合内其他元素之和。如集合 1,2,3{1,2,3}1,2,3 中就有一个加等式:3=1+23=1+23=1+2。而且 3=1+23=1+23=1+2 和 3=2+13=2+13=2+1 是相同的加等式,也是这个集合唯一的加等式。给定一个整数集合,编程找出其加等式的个数。
输入格式
第一行为 ttt,表示测试数据组数。
接下来 ttt 行,每行表示一组测试数据。其中第一个数 mmm,表示集合元素的个数,接下来 mmm 个不同的整数 xix_ixi,表示集合元素。
输出格式
对于每个输入数据,输出一个整数,表示其中加等式的个数。
样例 #1
样例输入 #1
3
3 1 2 3
3 1 2 5
6 1 2 3 5 4 6
样例输出 #1
1
0
7
提示
1≤t≤101\le t\le 101≤t≤10,1≤m≤301\le m \le 301≤m≤30,1≤x≤10001\le x\le 10001≤x≤1000。
本文介绍了一种编程方法,利用深度优先搜索(DFS)算法解决给定整数集合中加等式(某个元素等于其他元素之和)的计数问题。通过输入集合元素数量和元素值,输出加等式的个数。
1万+

被折叠的 条评论
为什么被折叠?



