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

问题描述
  从一个大小为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;
}
 

猜你喜欢

转载自blog.csdn.net/sdz20172133/article/details/81461976