子集樹算法文檔

1.算法概述

子集樹是一種?回溯算法,用于生成一個集合的所有子集。給定一個數組?arr,該算法遞歸地遍歷所有可能的子集,并通過一個輔助數組?x?標記當前元素是否被選中。

2.算法特點

  • 時間復雜度:O(2n)(因為一個包含?n?個元素的集合有?2n?個子集)。

  • 空間復雜度:O(n)(遞歸棧深度)。

  • 適用場景:需要枚舉所有子集的問題,如組合、子集和、冪集等。

3.代碼實現

#include <iostream>
#include <string>

using namespace std;
void func(int arr[], int i, int length,int x[])
{
?? ?if (i == length)//遞歸終止條件:處理完所有元素
?? ?{
?? ??? ?for (int j = 0; j < length; j++)
?? ??? ?{
?? ??? ??? ?if (x[j] == 1)//如果當前元素被選中,則輸出
?? ??? ??? ??? ?cout << arr[j] << " ";
?? ??? ?}
?? ??? ?cout << endl;
?? ?}
?? ?else
?? ?{
?? ??? ?x[i] = 1;//選擇當前節點
?? ??? ?func(arr, i + 1, length,x);//處理左子樹
?? ??? ?x[i] = 0;//不選擇當前節點
?? ??? ?func(arr, i + 1, length,x);//處理右子樹
?? ?}
}
int main()
{
?? ?int arr[] = { 1,2,3 };
?? ?int length = sizeof(arr) / sizeof(int);
?? ?int x[3] = { 0 };//初始化數組為0
?? ?func(arr, 0, length,x);
?? ?return 0;
}

? ?在此列一道題目:在給出序列中,求所選元素和? 與 未選元素和的最小差值是多少


#include <iostream>??
#include <cmath>? ??

using namespace std;?

// 定義全局變量
int arr[] = { 12, 6, 7, 11, 16, 3, 9 }; ?// 輸入的數字數組
const int length = sizeof(arr) / sizeof(int); ?// 計算數組長度

int x[length] = { 0 }; ? // 記錄當前選擇的元素(1表示選中,0表示未選中)
int sum = 0; ? ? ? ? ? // 記錄當前已選元素的和
int r = 0; ? ? ? ? ? ? // 記錄當前未選元素的和
int Min = 0x7FFFFFFF; ?// 記錄最小差值,初始設為最大整數值
int bestx[length] = { 0 }; ?// 記錄最佳選擇方案

// 回溯函數
void func(int i) {
? ? // 遞歸終止條件:已處理完所有元素
? ? if (i == length) {
? ? ? ? // 計算當前選擇與未選擇子集和的絕對差值
? ? ? ? int result = abs(sum - r);

? ? ? ? // 如果找到更小的差值,更新最優解
? ? ? ? if (result < Min) {
? ? ? ? ? ? Min = result; ?// 更新最小差值
? ? ? ? ? ? // 保存當前最佳選擇方案
? ? ? ? ? ? for (int j = 0; j < length; j++) {
? ? ? ? ? ? ? ? bestx[j] = x[j];
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? else {
? ? ? ? // 選擇當前元素arr[i]的情況
? ? ? ? r -= arr[i]; ? ? ?// 從未選和中減去當前元素
? ? ? ? sum += arr[i]; ? ?// 將當前元素加到已選和
? ? ? ? x[i] = 1; ? ? ? ? // 標記當前元素為已選
? ? ? ? func(i + 1); ? ? ?// 遞歸處理下一個元素

? ? ? ? // 不選擇當前元素arr[i]的情況
? ? ? ? sum -= arr[i]; ? ?// 從已選和中減去當前元素
? ? ? ? r += arr[i]; ? ? ?// 將當前元素加到未選和
? ? ? ? x[i] = 0; ? ? ? ? // 標記當前元素為未選
? ? ? ? func(i + 1); ? ? ?// 遞歸處理下一個元素
? ? }
}

int main() {
? ? // 計算數組所有元素的總和,初始化未選和r
? ? for (int v : arr) {
? ? ? ? r += v;
? ? }

? ? // 從第0個元素開始回溯搜索
? ? func(0);

? ? // 輸出結果
? ? cout << "Selected: ";
? ? // 輸出被選中的元素
? ? for (int i = 0; i < length; i++) {
? ? ? ? if (bestx[i]) {
? ? ? ? ? ? cout << arr[i] << " ";
? ? ? ? }
? ? }
? ? // 輸出最小差值
? ? cout << "\nMin difference: " << Min << endl;

? ? return 0;?
}
?

繼續列一道題:給出2n個整數,從里面挑選n個整數,使其讓選擇的整數的和? 與未選擇的整數的和的差值最小

#include <iostream>?
#include <cmath>? ? ?
#include <vector>? ?

// 定義全局變量
int arr[] = {12,6,7,11,16,3,8,9}; ? ? ? ? ? // 輸入的數字數組
const int length = sizeof(arr)/sizeof(int); // 計算數組長度
std::vector<int> x; ? ? ? ? ? ? ? ? ? ? ? ? // 當前選擇的元素集合(存儲元素值)
std::vector<int> bestx; ? ? ? ? ? ? ? ? ? ? // 最佳選擇的元素集合
int sum; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 當前已選元素的和
int Left = length; ? ? ? ? ? ? ? ? ? ? ? ? // 剩余未處理的元素個數(初始為總長度)
int r; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 當前未選元素的和
unsigned int Min = INT_MAX; ? ? ? ? ? ? ? // 記錄最小差值(初始為最大整數值)
int cnt; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 記錄遞歸調用次數(調試用)

// 回溯函數(i表示當前處理元素的索引)
void func(int i) {
? ? // 遞歸終止條件:已處理完所有元素
? ? if (i == length) {
? ? ? ? cnt++; // 遞歸次數統計
? ? ? ??
? ? ? ? // 檢查是否恰好選中一半元素
? ? ? ? if (x.size() != length/2) return;
? ? ? ??
? ? ? ? // 計算當前差值
? ? ? ? int result = abs(sum - r);
? ? ? ??
? ? ? ? // 更新最優解
? ? ? ? if (result < Min) {
? ? ? ? ? ? Min = result; ? ?// 更新最小差值
? ? ? ? ? ? bestx = x; ? ? ? // 深拷貝當前選擇路徑
? ? ? ? }
? ? ? ? return;
? ? }
? ? // 未處理完所有元素時的遞歸操作
? ? else {
? ? ? ? Left--; // 減少剩余未處理元素數量
? ? ? ??
? ? ? ? // 分支1:選擇當前元素(需滿足選擇數量未過半)
? ? ? ? if (x.size() < length/2) { // 剪枝條件1:已選數量不能超過半數
? ? ? ? ? ? // 選擇當前元素
? ? ? ? ? ? sum += arr[i]; ? // 更新已選和
? ? ? ? ? ? r -= arr[i]; ? ? // 更新未選和
? ? ? ? ? ? x.push_back(arr[i]); // 記錄選擇路徑
? ? ? ? ? ??
? ? ? ? ? ? func(i+1); // 遞歸處理下一個元素
? ? ? ? ? ??
? ? ? ? ? ? // 回溯操作
? ? ? ? ? ? sum -= arr[i]; ? // 恢復已選和
? ? ? ? ? ? r += arr[i]; ? ? // 恢復未選和
? ? ? ? ? ? x.pop_back(); ? ?// 移除當前選擇
? ? ? ? }
? ? ? ??
? ? ? ? // 分支2:不選擇當前元素(需滿足剩余元素足夠湊夠半數)
? ? ? ? if (x.size() + Left >= length/2) { // 剪枝條件2:剩余元素足夠完成選擇
? ? ? ? ? ? func(i+1); // 遞歸處理下一個元素
? ? ? ? }
? ? ? ??
? ? ? ? Left++; // 恢復剩余未處理元素數量
? ? }
}

int main() {
? ? // 初始化未選和(總和)
? ? for(int num : arr) {
? ? ? ? r += num;
? ? }
? ??
? ? func(0); // 從第0個元素開始回溯
? ??
? ? // 輸出結果
? ? std::cout << "Selected elements: ";
? ? for(int v : bestx) {
? ? ? ? std::cout << v << " ";
? ? }
? ? std::cout << "\nMinimum difference: " << Min << std::endl;
? ? std::cout << "Total recursions: " << cnt << std::endl;?
? ??
? ? return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/80466.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80466.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/80466.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HTTP/1.1 host虛擬主機詳解

一、核心需求&#xff1a;為什么需要虛擬主機&#xff1f; 在互聯網上&#xff0c;我們常常希望在一臺物理服務器&#xff08;它通常只有一個公網 IP 地址&#xff09;上運行多個獨立的網站&#xff0c;每個網站都有自己獨特的域名&#xff08;例如 www.a-site.com?, www.b-s…

amass:深入攻擊面映射和資產發現工具!全參數詳細教程!Kali Linux教程!

簡介 OWASP Amass 項目使用開源信息收集和主動偵察技術執行攻擊面網絡映射和外部資產發現。 此軟件包包含一個工具&#xff0c;可幫助信息安全專業人員使用開源信息收集和主動偵察技術執行攻擊面網絡映射并執行外部資產發現。 使用的信息收集技術 技術數據來源APIs&#xf…

Spring Web MVC響應

返回靜態頁面 第一步 創建html時&#xff0c;要注意創建的路徑&#xff0c;要在static下面 第二步 把需要寫的內容寫到body內 第三步 直接訪問路徑就可以 返回數據ResponseBody RestController Controller ResponseBody Controller&#xff1a;返回視圖 ResponseBody&…

?鴻蒙PC正式發布:國產操作系統實現全場景生態突破

鴻蒙PC正式發布&#xff1a;國產操作系統實現全場景生態突破? 2025年5月8日&#xff0c;華為在深圳舉辦發布會&#xff0c;正式推出搭載鴻蒙操作系統的個人電腦&#xff08;PC&#xff09;&#xff0c;標志著國產操作系統在核心技術與生態布局上實現歷史性跨越。此次發布的鴻蒙…

【計算機視覺】OpenCV實戰項目:Text-Extraction-Table-Image:基于OpenCV與OCR的表格圖像文本提取系統深度解析

Text-Extraction-Table-Image&#xff1a;基于OpenCV與OCR的表格圖像文本提取系統深度解析 1. 項目概述2. 技術原理與算法設計2.1 圖像預處理流水線2.2 表格結構檢測算法2.3 OCR優化策略 3. 實戰部署指南3.1 環境配置3.2 核心代碼解析3.3 執行流程示例 4. 常見問題與解決方案4.…

Redis BigKey 問題是什么

BigKey 問題是什么 BigKey 的具體表現是 redis 中的 key 對應的 value 很大&#xff0c;占用的 redis 空間比較大&#xff0c;本質上是大 value 問題。 BigKey怎么找 redis-cli --bigkeysscanBig Key 產生的原因 1.redis數據結構使用不恰當 2.未及時清理垃圾數據 3.對業務預…

go-gin

前置 gin是go的一個web框架&#xff0c;我們簡單介紹一下gin的使用 導入gin &#xff1a;"github.com/gin-gonic/gin" 我們使用import導入gin的包 簡單示例&#xff1a; package mainimport ("github.com/gin-gonic/gin" )func main() {r : gin.Default(…

C# NX二次開發:判斷兩個體是否干涉和獲取系統日志的UFUN函數

大家好&#xff0c;今天要講關于如何判斷兩個體是否干涉和獲取系統日志的UFUN函數。 &#xff08;1&#xff09;UF_MODL_check_interference&#xff1a;這個函數的定義為根據單個目標體檢查每個指定的工具體是否有干擾。 Defined in: uf_modl.h Overview Checks each sp…

如何解決 Linux 系統文件描述符耗盡的問題

在Linux系統中&#xff0c;文件描述符&#xff08;File Descriptor, FD&#xff09;是操作系統管理打開文件、套接字、管道等資源的抽象標識。當進程或系統耗盡文件描述符時&#xff0c;會導致服務崩潰、連接失敗等嚴重問題。以下是詳細的排查和解決方案&#xff1a; --- ###…

LVGL簡易計算器實戰

文章目錄 &#x1f4c1; 文件結構建議&#x1f539; eval.h 表達式求值頭文件&#x1f539; eval.c 表達式求值實現文件&#xff08;帶詳細注釋&#xff09;&#x1f539; ui.h 界面頭文件&#x1f539; ui.c 界面實現文件&#x1f539; main.c 主函數入口? 總結 項目效果&…

使用countDownLatch導致的線程安全問題,線程不安全的List-ArrayList,線程安全的List-CopyOnWriteArrayList

示例代碼 package com.example.demo.service;import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class UnSafeCDTest {Executor…

ALLinSSL:一站式SSL證書管理解決方案

引言 在當今互聯網安全日益重要的背景下,SSL證書已成為保護網站安全的必備工具。然而,管理多個SSL證書常常是一項繁瑣且容易出錯的任務。ALLinSSL應運而生,它提供了一個一站式的SSL證書管理解決方案,大大簡化了證書的申請、安裝和更新過程。本文將深入介紹ALLinSSL的特性、…

嵌入式通信協議總覽篇:萬物互聯的基石

嵌入式系統的世界,是靠協議“說話”的世界。 在你設計一個智能設備、構建一個工業控制系統、開發一款 IoT 網關時,一個核心問題始終繞不開:**這些設備之間如何“對話”?**答案就是——通信協議。 本篇作為系列第一章,將帶你全面理解嵌入式通信協議的全貌,為后續深入學習…

【數據結構】紅黑樹(C++)

目錄 一、紅黑樹的概念 二、紅黑樹的性質 三、紅黑樹結點定義 四、紅黑樹的操作 1. 插入操作 1.1 插入過程 1.2 調整過程 1.2.1 叔叔節點存在且為紅色 1.2.2 叔叔節點存在且為黑色 1.2.3 叔叔節點不存在 2. 查找操作 2.1 查找邏輯 2.2 算法流程圖 2.3 使用示例 …

Oracle數據庫DBF文件收縮

這兩天新部署了一套系統&#xff0c;數據庫結構保持不變&#xff0c;牽扯導出表結構還有函數&#xff0c;圖省事就直接新建用戶&#xff0c;還原數據庫了。然后咔咔咔&#xff0c;一頓刪除delete&#xff0c;truncate&#xff0c;發現要不就是表刪了&#xff0c;還有num_rows&a…

【字節擁抱開源】字節豆包團隊開源首發 Seed-Coder 大模型

我們非常高興地向大家介紹 Seed-Coder&#xff0c;它是一個功能強大、透明、參數高效的 8B 級開源代碼模型系列&#xff0c;包括基礎變體、指導變體和推理變體。Seed-Coder 通過以下亮點促進開放代碼模型的發展。 以模型為中心&#xff1a;Seed-Coder主要利用大語言模型&#…

Qt 無邊框窗口,支持貼邊分屏

常規操作, 無法進行窗口的大小縮放和移動貼邊分屏等操作 // 去掉標題欄,去掉工具欄&#xff0c;窗口置頂 setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint);重點介紹 QWindowKit https://github.com/stdware/qwindowkit 跨平臺的支持Windows\…

Qt 樣式表:全面解析與應用指南

在 Qt 開發中,樣式表(Style Sheets)是定義應用程序界面外觀的關鍵工具。它采用文本格式的規則集合,借鑒了 CSS 語法,借助選擇器、屬性和值,能精準把控各類控件的外觀表現,極大提升了界面設計的靈活性與美觀性。 文章目錄 一、樣式可更改的效果?1、顏色相關效果?2、字體…

追蹤大型語言模型的思想(上)(來自針對Claude的分析)

概述 像 Claude 這樣的語言模型并非由人類直接編程&#xff0c;而是通過大量數據進行訓練。在訓練過程中&#xff0c;它們會學習解決問題的策略。這些策略被編碼在模型為每個單詞執行的數十億次計算中。對于我們這些模型開發者來說&#xff0c;這些策略是難以捉摸的。這意…