问题标题: 酷町堂:1047 子集和问题

0
0
已解决
汪恺恒
汪恺恒
中级启示者
中级启示者

题目描述 Description

子集和问题的一个实例为〈S,t〉。其中,S={ x1, x2,…, xn}是一个正整数的集合,c是一个正整数。子集和问题判定是否存在S的一个子集S1,使得子集S1和等于c。
对于给定的正整数的集合S={ x1, x2,…, xn}和正整数c,编程计算S 的一个子集S1,使得子集S1和等于c。
如果有多组子集和满足条件,只输出元素下标字典序最小的一组解。

输入描述 Input Description

第1行有2个正整数n和c,n表示S的个数,c是子集和的目标值。接下来的1 行中,有n个正整数,表示集合S中的元素。

输出描述 Output Description

程序运行结束时,将子集和问题的解输出。当问题无解时,输出“No solution!”。

 

3、9、10三个点直接2000多ms……

code

#include<iostream>
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
int n,a[10005],c,sum,ans[10005];
bool flag;
void print(int s){
	flag=1;
	for(int i=0;i<=s-1;i++){
		cout<<ans[i]<<" ";
	}
	return ;
}
void dfs(int cnt,int pos){
	if(flag) return ;
	if(sum==c){
		print(cnt);
		return ;
	}
	if(sum>c||cnt>n) return ;
	for(int i=pos;i<=n;i++){
		sum+=a[i];
		ans[cnt]=a[i];
		dfs(cnt+1,i+1);
		sum-=a[i];
		ans[cnt]=0;
	}
	return ;
}
int main(){
	cin>>n>>c;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	dfs(0,1);
	if(!flag) cout<<"No solution!";
	return 0;
}

拒绝老帖网址!

汪恺恒在2021-03-03 12:48:58追加了内容

我会了,谁能再找出一个剪枝就采纳谁


0
已采纳
张帆
张帆
中级天翼
中级天翼

你再加上个后缀和,如果当前sum加上后面所有数还达不到c,就break。

张帆在2021-03-07 11:05:25追加了内容

不对,是return ;

0
0
我要回答