当前位置: 代码迷 >> 综合 >> ALGO-115_蓝桥杯_算法训练_和为T
  详细解决方案

ALGO-115_蓝桥杯_算法训练_和为T

热度:40   发布时间:2024-01-15 07:51:55.0

问题描述
  从一个大小为n的整数集中选取一些元素,使得它们的和等于给定的值T。每个元素限选一次,不能一个都不选。
输入格式
  第一行一个正整数n,表示整数集内元素的个数。
  第二行n个整数,用空格隔开。
  第三行一个整数T,表示要达到的和。
输出格式
  输出有若干行,每行输出一组解,即所选取的数字,按照输入中的顺序排列。
  若有多组解,优先输出不包含第n个整数的;若都包含或都不包含,优先输出不包含第n-1个整数的,依次类推。
  最后一行输出总方案数。


样例输入

5
-7 -3 -2 5 9 

0
样例输出
-3 -2 5
-7 -2 9

2
数据规模和约定
  1<=n<=22
  T<=maxlongint
  集合中任意元素的和都不超过long的范围

 

算法分析:

直接枚举子集就ok

采用二进制法枚举子集(解释点这里):

9

5

-2

-3

-7

0

0

0

0

1

0

0

0

1

0

0

0

0

1

1

0

0

1

0

0

0

0

1

1

0

0

0

1

1

1

0

1

0

0

0

……

由于题目要求按顺序输出,集合S0表示不取,1表示取,按表格顺序即可顺序输出结果

 

代码实现:

 

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
const int maxn = 2005;
int a[maxn], n, t, cnt;
int main()
{cin >> n;for(int i = 0; i < n; i++) cin >> a[i];cin >> t;for(int i = 1; i < (1 << n); i++){int sum = 0;for(int j = 0; j < n; j++){if(i & (1 << j))sum += a[j];}if(sum == t){for(int j = 0; j < n; j++){if(i & (1 << j))cout << a[j] << " ";}cout << endl;cnt++;}}cout << cnt << endl;
}

 

  相关解决方案