Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

サブセット和のための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

  1. 配列要素の乗算のためのC++プログラム

    整数要素の配列で与えられ、タスクは配列の要素を乗算して表示することです。 例 Input-: arr[]={1,2,3,4,5,6,7} Output-: 1 x 2 x 3 x 4 x 5 x 6 x 7 = 5040 Input-: arr[]={3, 4,6, 2, 7, 8, 4} Output-: 3 x 4 x 6 x 2 x 7 x 8 x 4 = 32256 以下のプログラムで使用されるアプローチは次のとおりです − 一時変数を初期化して、最終結果を1で格納します ループを0からnまで開始します。nは配列のサイズです 最終結果を得るには、tempの値にarr[i]を掛け続

  2. C++での8進数から10進数への変換のプログラム

    入力として8進数を指定すると、タスクは指定された8進数を10進数に変換することです。 コンピューターの10進数は10進数で表され、8進数は0から7までの8進数で表されますが、10進数は0から9までの任意の数字にすることができます。 8進数を10進数に変換するには、次の手順に従います- 余りから右から左に数字を抽出し、それを0から始まる累乗で乗算し、(桁数)–1まで1ずつ増やします。 8進数から2進数に変換する必要があるため、8進数の基数は8であるため、累乗の基数は8になります。 指定された入力の桁にベースとパワーを掛けて、結果を保存します 乗算されたすべての値を加算して、10進数になる