题目描述:
给定整数a1、a2、.......an,判断是否可以从中选出若干数,使它们的和恰好为k。
输入要求:
有多组测试数据。每组测试数据两行:
第一行:正整数n、整数k,n表示数的个数,k表示数的和。
第二行:n个数
输出要求:
每组测试数据,如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO”
#include<iostream>
#include<cmath>
#include<iomanip>
#include<algorithm>
#include<cstring>
using namespace std;
int isadd[1000];
int partsum(int arr[], int k, int n)
{
int times = pow(2, n);
for (int i = times - 1; i >= 0; i--)//利用二进制的特性,找出所有排列的可能性
{
int number = i, count = 0, place = 0, sum = 0;
while (number)
{
if (number % 2)
{
sum += arr[place];
isadd[count] = arr[place];
count++;
}
if (sum == k)
{
return count;
}
number /= 2;
place++;
}
}
return 0;
}
int main() {
int n, k;
while (cin >> n >> k)
{
int arr[n], count;
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
count = partsum(arr, k, n);
if (count)
{
cout << "YES" << endl;
for (int i = 0; i < count; i++)
{
if ((i != count - 1) && isadd[i] != 0)
{
cout << isadd[i] << " ";
}
else if ((i == count - 1) && isadd[i] != 0)
{
cout << isadd[i];
}
}
cout << endl;
}
else
{
cout << "NO" << endl;
}
}
return 0;
}