华为机试【求符合条件元组个数】

给定一个整数数组 nums 、一个数字k,一个整数目标值 target,请问nums中是否存在k个元素使得其相加结果为target,请输出所有符合条件且不重复的k元组的个数。

数据范围

2<= nums.length <= 200

-10^9<= nums[i] <= 10^9

-10^9<= target <= 10^9

2 <= k<= 100

#include<stdio.h>

#include<malloc.h>

#include<stdlib.h>

#include<string.h>

//在数组中取k个数,等于target,有多少种取法,输出结果

int A[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

int k = 5;

int target = 25;

const int max = 15;

int** result = (int**)malloc(sizeof(int*)*max);

int resultcount = 0;

int *path = (int*)malloc(sizeof(int)*k);

int pathCount = 0;

void printF()

{

for (int i = 0; i < max; i++)

{

for (int j = 0; j < k; j++)

{

printf("%d", result[i][j]);

}

printf("\n");

}

}

bool cmp(int*A, int*B,int num)

{

for (int i = 0; i < num; i++)

{

if (A[i] != B[i]){

return false;

}

}

return true;

}

void put(int* path)

{

int sum = 0;

for (int i = 0; i < k; i++)

{

sum += path[i];

}

if (sum != target)

{

return;

}

bool iscontain = false;

//if result contain path :skip

for (int i = 0; i < resultcount; i++)

{

if (cmp(result[resultcount], path, k))

{

iscontain = true;

break;

}

}

if (!iscontain)

{

memcpy(result[resultcount++], path, sizeof(int)*k);

printF();

}

}

void back(int startIndx)

{

if (pathCount == k)

{

put(path);

return;

}

for (int i = startIndx; i < sizeof(A)/sizeof(A[0]); i++)

{

path[pathCount++] = A[i];

back(i + 1);

pathCount--;

}

}

int main()

{

for (int i = 0; i < max; i++)

{

result[i] = (int*)malloc(sizeof(int)*k);

}

back(0);

return 0;

}

全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务