域起网络校招研发编程测试题-4

域起网络校招研发编程测试题-4_第1张图片

需要用到递归思想,每一步可分为三种情况,若还能加就继续递归,若和为K则输出并返回,若和不为K且不能再加则根据输出None或者更新最接近数组c。如果当前b的和距离K更接近,则将当前的b数组复制到c。

非提高版:

// 输入示例(第一行输入k和n,n代表共输入的数)
// 6 6
// 1 2 3 4 5 6
#include 
#include 
#include 
#include 
using namespace std;

int k = 0;
int n = 0;
int flag = 0;

void f(int n, int *a, int *b)
{
	static int n1 = 0;
	static int n2 = -1;
	int i;
	int j;
	
	for(i = n1;i < 10;i++)
	{
		if(n > a[i])
		{
			n1 = i+1;
			n2++;
			b[n2] = a[i];
			n -= a[i];
			f(n, a, b);
			n += a[i];
			n2--;
		}
		else if(n == a[i])
		{
			n2++;
			b[n2] = a[i];
			for(j = 0;j <= n2;j++)
			{
				printf("%d ",b[j]);
			}
			printf("\n");
            flag = 1;
			n2--;
			return;
		}
		else
		{
			return;
		}
	}
}

int main()
{
    scanf("%d", &k);
    scanf("%d", &n);
    int a[n];
    int b[n];
    for(int i=0; i

提高版:

// 输入示例(第一行输入k和n,n代表共输入的数)
// 6 6
// 1 2 3 4 5 6
#include 
#include 
#include 
#include 
#include
using namespace std;

int k = 0;
int n = 0;
int flag = 0;
int s = 999999;

int sum(int *num){
    int t = 0;
    for(int i=0; i a[i])
		{
			n1 = i+1;
			n2++;
			b[n2] = a[i];
			n -= a[i];
			f(n, a, b, c);
			n += a[i];
			n2--;
            if(k-sum(b)0){
                printf("%d ", c[i]);
            }
        }
        printf("\n");
    }
    return(0);
}

 

你可能感兴趣的:(域起网络校招研发编程测试题-4)