[求助(可能是)站外题]和为T
  • 板块学术版
  • 楼主HeiCat0725
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/7/19 22:48
  • 上次更新2024/7/20 08:42:10
查看原帖
[求助(可能是)站外题]和为T
941560
HeiCat0725楼主2024/7/19 22:48

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

*/
2024/7/19 22:48
加载中...