rt,WA,代我弟弟问一下题。(其实自己写也没过orz())希望有大佬能提供原题或指出错误。
从一个大小为n的整数集中选取一些元素,使得它们的和等于给定的值T。每个元素限选一次,不能一个都不选。
第一行一个正整数n,表示整数集内元素的个数。
第二行n个整数,用空格隔开。
第三行一个整数T,表示要达到的和。
输出有若干行,每行输出一组解,即所选取的数字,按照输入中的顺序排列。
若有多组解,优先输出不包含第n个整数的;若都包含或都不包含,优先输出不包含第n-1个整数的,依次类推。
最后一行输出总方案数。
1<=n<=22
T<=maxlongint
集合中任意元素的和都不超过long的范围
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int n;
ll arr[30];
bool vis[30];
ll t;
ll res;
ll ans;
bool f=0;
void dfs(int i,int p){
if(i==n){
if(p==1){
vis[i]=1;
res+=arr[i];
}
if(res==t){
for(int j=1;j<=n;j++){
if(vis[j]==1){
f=1;
printf("%d ",arr[j]);
}
}
if(f==1){
printf("\n");
ans++;
}
f=0;
}
if(p==1){
vis[i]=0;
res-=arr[i];
}
return ;
}
if(p==1){
vis[i]=1;
res+=arr[i];
}
dfs(i+1,1);
dfs(i+1,0);
if(p==1){
vis[i]=0;
res-=arr[i];
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lld",&arr[i]);
scanf("%lld",&t);
dfs(1,1);
dfs(1,0);
printf("%lld",ans);
return 0;
}
/*
3
3 5
-4 1
-2 3
*/