题目信息:
题目描述
【问题描述】对于一个给定正整数的集合s={x1,x2,x3…xn}和正整数c,编程计算s的一个子集s1,使得子集s1的和等于c。
【输入格式】
第一行有2个正整数n和c,第二行有n个正整数
【输出格式】
一行数据,按输入的顺序输出,若无解则输出"No Solution!"
【输入样例】
5 10
2 2 6 5 4
【输出样例】
2 2 6
【问题规模】
n<7000,c<maxlongint
#include<cstdio>
#include<iostream>
#include<cstring>
#define N 10005
using namespace std;
int a[N],c,v[N],ans[N],n,flag;
void dfs(int temp) {
if(flag==1) return;
for(int i=0; i<n; i++) {
if(v[i]==0&&c-a[i]>=0) {
if(flag==1)return;
c-=a[i];
v[i]=1;
ans[temp]=a[i];
if(c==0) {
if(flag==0)
{
for(int j=0; j<=temp; j++)
printf("%d ",ans[j]);
printf("\n");
}
flag=1;
return;
} else
dfs(temp+1);
if(flag==1) return;
v[i]=0;//回溯
c+=a[i];
}
}
}
int main() {
while(~scanf("%d%d",&n,&c)) {
int sum=0;
for(int i=0; i<n; i++) {
scanf("%d",&a[i]);
sum+=a[i];
}
if(sum<c) {
printf("No Solution!\n");
continue;
}
memset(v,0,sizeof(v));
memset(ans,0,sizeof(ans));
flag=0;
dfs(0);
if(flag==0)
printf("No Solution!\n");
}
}