问题描述
从一个大小为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的范围
22
1 -1 2 -2 4 -4 8 -8 16 -16 32 -32 64 -64 128 -128 256 -512 512 -1024 -256 1024
0
这个例子过不去 只算了2046个 答案有2047个。
感觉没写全 就是 若都包含或都不包含,优先输出不包含第n-1个整数的 这句话没写出来
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include <cstdio>
using namespace std;
int n,T,a[25],b[25]={0},y[25]={0},cnt=0 , k=0;;
void dfs(long long x,long long s,long long pos)
{
long long i,c=0;
if (x>=n)
return ;
if (s == T&&x>0)
{
if(b[x-1] == a[n-1])
{
for (i=0; i<x; i++)
{
y[k++] = b[i];
}
}
else{
for (i=0; i<x; i++)
{
cout << b[i] << " ";
}
cout << endl;}
cnt++;
}
for (i=pos; i<n; i++)
{
// if (!v[i])
{
// v[i] = 1;
b[x] = a[i];
s+=b[x];
dfs(x+1,s,i+1);
s-=b[x];
// v[i] = 0;
}
}
}
int main()
{
int i;
cin >> n;
for (i=0; i<n; i++)
cin >> a[i];
cin >> T;
dfs(0,0,0);
int flag = 0,sign[23]={0};
for(int i=0; i<k; i++)
{
// if(y[i])
cout << y[i] << " ";
flag += y[i];
if(flag == T && sign[i]==0)
{
cout << endl;
flag = 0;
}
sign[i] = y[i];
}
cout << cnt << endl;
return 0;
}