题目描述
给定n个整数a1、a2、.......an,判断是否可以从中选出若干数,使它们的和恰好为k。
输入
第一行输入t表示有t组测试数据。每组测试数据两行:
第一行:正整数n、整数k,n表示数的个数,k表示数的和。
第二行:n个数
输出
每组测试数据,如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO”
IO模式
本题IO模式为标准输入/输出(Standard IO),你需要从标准输入流中读入数据,并将答案输出至标准输出流中。

这个题参考了代码,请大家支持原作者啊nyoj1058 部分和问题_有n个a1 a2到an个数,问能否找到若干个数使其和为k,写cpp代码-优快云博客
改动了输出格式,解中的最后一个数输出后不输出空格,贴一下这部分
summ=0;
if(search(0,0))
{
printf("YES\n");
for(int i=0;i<n;i++){
if(mark[i]){
printf("%d",a[i]);
summ+=a[i];
if(summ!=k)
printf(" ");
}
}
printf("\n");
}
else
printf("NO\n");
以及改动了应输入t组数据
总体代码如下:(只是在这里存一下免得之后找不到,希望大家还是去支持原作者
#include <stdio.h>
#include <string.h>
int a[100],mark[100];
int n,k;
int search(int x,int sum);
int main()
{
int t,summ;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
memset(mark,0,sizeof(mark));
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
summ=0;
if(search(0,0))
{
printf("YES\n");
for(int i=0;i<n;i++){
if(mark[i]){
printf("%d",a[i]);
summ+=a[i];
if(summ!=k)
printf(" ");
}
}
printf("\n");
}
else
printf("NO\n");
}
return 0;
}
int search(int x,int sum)
{
if(sum==k)
return 1;
if(sum>k||x==n)
return 0;
if(search(x+1,sum))//不加
return 1;
if(search(x+1,sum+a[x]))//加
{
mark[x] = 1;
return 1;
}
return 0;
}
(建议在文章类型里面加一个介于原创和转载之间的“裁缝”(bushi)
513

被折叠的 条评论
为什么被折叠?



