题目大意:
给定整数a1,a2,..,an,判断是否可以从中选出若干数,使它们的和为k,如果存在请打印,n<=20。
ac代码1:
#include<bits/stdc++.h>
using namespace std;
int n,k,a[22],b[22],flag,sum;
void dfs(int pos){
if(flag == 1)
return ;
if(sum >= k){
if(sum == k){
flag=1;
printf("YES\n");
for(int i=1;i<=n;i++){
if(b[i]){
printf("%d ",a[i]);
}
}
}
return ;
}
for(int i=pos;i<=n;i++){
sum+=a[i];
b[i]=1;
dfs(i+1);
sum-=a[i];
b[i]=0;
}
}
int main()
{
int i;
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
dfs(1);
if(!flag)
printf("NO\n");
return 0;
}
using namespace std;
int n,k,a[22],b[22],flag,sum;
void dfs(int pos){
if(flag == 1)
return ;
if(sum >= k){
if(sum == k){
flag=1;
printf("YES\n");
for(int i=1;i<=n;i++){
if(b[i]){
printf("%d ",a[i]);
}
}
}
return ;
}
for(int i=pos;i<=n;i++){
sum+=a[i];
b[i]=1;
dfs(i+1);
sum-=a[i];
b[i]=0;
}
}
int main()
{
int i;
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
dfs(1);
if(!flag)
printf("NO\n");
return 0;
}
ac代码2:#include<bits/stdc++.h>
using namespace std;
int n,k,a[22],b[22];
int dfs(int i,int sum){
if(i==n+1) return sum==k;
if(dfs(i+1,sum)) {
b[i]=0;
return 1;
}
if(dfs(i+1,sum+a[i])) {
b[i]=1;
return 1;
}
return 0;
}
int main()
{
int i;
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
if(dfs(1,0)){
printf("YES\n");
for(i=1;i<=n;i++){
if(b[i]==1){
printf("%d ",a[i]);
}
}
}
else printf("NO\n");
return 0;
}
using namespace std;
int n,k,a[22],b[22];
int dfs(int i,int sum){
if(i==n+1) return sum==k;
if(dfs(i+1,sum)) {
b[i]=0;
return 1;
}
if(dfs(i+1,sum+a[i])) {
b[i]=1;
return 1;
}
return 0;
}
int main()
{
int i;
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
if(dfs(1,0)){
printf("YES\n");
for(i=1;i<=n;i++){
if(b[i]==1){
printf("%d ",a[i]);
}
}
}
else printf("NO\n");
return 0;
}