题解
- 这题是关于递归的经典例题,题解全部位于代码注释中。
题目
问题 F: 部分和问题(数组,函数)
时间限制: 1 Sec 内存限制: 128 MB
提交: 683 解决: 293
[提交][状态][讨论版]
题目描述
给定整数a1、a2、.......an,判断是否可以从中选出若干数,使它们的和恰好为k。
输入
有多组测试数据。每组测试数据两行:
第一行:正整数n、整数k,n表示数的个数,k表示数的和。
第二行:n个数
输出
每组测试数据,如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO”
样例输入
5 20
10 2 4 7 1
4 10
1 2 -10 4
样例输出
YES
10 2 7 1
NO
代码块
#include <stdio.h>
#include <stdlib.h>
int n, k, *a, j, b[1000];
int function(int temp, int sum, int *S)
{
if(temp)
{
temp--;
for(int i=0; i<n; i++)
{
if(!S[i] && a[i])
{
S[i] = 1;
if((sum+a[i])==k || function(temp, sum+a[i], S))
{
b[j] = a[i];
j++;
return 1;
}
S[i] = 0;
}
}
}
return 0;
}
int main(void)
{
while((scanf("%d", &n))!=EOF)
{
int i;
scanf("%d", &k);
a = (int *)malloc(n*sizeof(int));
for(i=0; i<n; i++)
scanf("%d", &a[i]);
int sum = 0;
int temp = n;
int S[n];
for(i=0; i<n; i++)
S[i] = 0;
j = 0;
if(function(temp, sum, S))
{
printf("YES\n");
for(i=j-1; i>=0; i--)
{
if(i)
printf("%d ", b[i]);
else
printf("%d", b[i]);
}
printf("\n");
}
else
printf("NO\n");
}
}