子集和 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
廣告
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP