子集总和的C / C ++程序(回溯)

回溯是一种解决动态编程问题的技术。它会一步一步地工作,并拒绝那些不会导致解决方案的路径,并将回溯(移回)到先前的位置。

在子集和问题中,我们必须找到一个集合的子集,使得该子集和的元素达到给定数K。集合的所有元素都是正且唯一的(不存在重复元素)。

为此,我们将创建子集并检查它们的总和是否等于给定数k。让我们看一个创建解决方案的程序

示例

#include <stdio.h>

#include <stdlib.h>

static int total_nodes;

void printValues(int A[], int size){

   for (int i = 0; i < size; i++) {

      printf("%*d", 5, A[i]);

   }

   printf("\n");

}

void subset_sum(int s[], int t[], int s_size, int t_size, int sum, int ite, int const target_sum){

   total_nodes++;

   if (target_sum == sum) {

      printValues(t, t_size);

      subset_sum(s, t, s_size, t_size - 1, sum - s[ite], ite + 1, target_sum);

      return;

   }

   else {

      for (int i = ite; i < s_size; i++) {

         t[t_size] = s[i];

         subset_sum(s, t, s_size, t_size + 1, sum + s[i], i + 1, target_sum);

      }

   }

}

void generateSubsets(int s[], int size, int target_sum){

   int* tuplet_vector = (int*)malloc(size * sizeof(int));

   subset_sum(s, tuplet_vector, size, 0, 0, 0, target_sum);

   free(tuplet_vector);

}

int main(){

   int set[] = { 5, 6, 12 , 54, 2 , 20 , 15 };

   int size = sizeof(set) / sizeof(set[0]);

   printf("The set is ");

   printValues(set , size);

   generateSubsets(set, size, 25);

   printf("Total Nodes generated %d\n", total_nodes);

   return 0;

}

输出结果

The set is 5 6 12 54 2 20 15

5 6 12 2

5 20

Total Nodes generated 127

以上是 子集总和的C / C ++程序(回溯) 的全部内容, 来源链接: utcz.com/z/322295.html

回到顶部