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追加了内容
我会了,谁能再找出一个剪枝就采纳谁